C/C++

Qt designer project gondok

Fórumok

Sziasztok!

Még elég új tag vagyok.Bocsássatok meg ha valami olyasmit kérdeznék amit már kérdeztek, de abban a stádiumban vagyok, hogy nem érek rá keresgélni. A szakdolgozatom témája egy (nagyon röviden) kliens szervek progi megirása + adatbázis kezelés. Én mivel szg hálózati mérnök leszek ezért Linux alatt akarom elkésziteni a progit grafikus környezetben. Ehhez a legjobb fejlesztői környezet számomra a Qt designer. Ezt a topicot szeretném használni az időközben felmerülő problémáim közszemlére bocsátásra, igy lehet hogy más is tanul belőle. amúgy majd a kész szakdolgozatomat is elküldöm annak aki kéri.

A most aktuális probléma: A programomat csak illetékesek használhatják username/passwd.
A progi föablaka előtt egy info gyüjtő ablak jelenik meg ami bekéri ezeket az adatokat. A föablak osztályának init() fügvényében hivom meg a bejelentkezö ablakot:
[mainform.ui.h:]

#include "passwdform.h"

void MainForm::init()
{
QDialog* passwdform = new PasswdForm;
passwdform->exec();
}

Ez addig jó is hogy a föablak meg sem jelenik mig a passwdform látható.

Probléma: Nem tudom hogy kell kivédeni azt hogy ha a felhasználó csak simán bezárja a passwdform ablakot akkor ne jelenjen meg a mainform ablak. Mert ezzel a koddal még csak ez történik. Melyik az a signal amit figyelni kell a passwdform bezarasakor vagy ha alapértelmezetten nincs ilyen akkor hogy kéne megirni. Gondolom ez a signal figyelné hogy az OK gomb a Cancel gomb vagy az X gomb vezetett az ablak bezárásához. ....
Nem akarok tovább "beszélni", hátha valaki csipőből tudja a választ.

kétirányú láncolt lista

Fórumok

Sziaszotok!
Segítséget szeretnék kérni, a beadndóhoz. Kétirányú fejelemes láncolt listát kéne implementálni beépített típusok nélkül. A gonodom, hogy a fejelem a konstruktor meghívása után nem adódik át?
Tud valaki tanácsot adni?
Köszi a segítséget!


//main
/*
Készítsen egy sor típust! Alkalmazzon osztályt! A sorokat kétirányú fejelemes ciklikus láncolt 
listával ábrázolja! Implementálja a szokásos műveleteket, és egy összefűző műveletet is, ami
az első sorhoz sorban hozzáfűzi a második sor elemeit! (A második sor végül legyen üres!) 
Egészítse ki az osztályt a kényelmes és biztonságos használat érdekében megfelelő metódusokkal 
(sorbeolvasó operátor>>, sorkiíró operátor<<),  alkalmazzon kivételkezelést, és bontsa modulokra 
a programját!  A teszt környezet hívja meg azt a műveletet is, amely kiszámítja két sor összefűzését! 
Az összefűzés és a többi operáció műveletigénye is ?(1), kivéve a sorbeolvasó és sorkiíró operátorokat.
*/

#include <iostream>
#include <string>
#include "sequence.h"
#include "node.h"

using namespace std;

class Menu
{
public:
	void Run();
private:
	void MenuWrite();
	void Insert();
	void Write();
	void Union();

	Sequence sor;

};

int main()
{
	
	Menu m;
	m.Run();

	return 0;
}

void Menu::Run()
{
	int n = 0;
	do
	{
		MenuWrite();
		cin >> n;
		switch (n)
		{
			case(1): Insert(); break;
			case(2): Write(); break;
			case(3): Union(); break;
		}
	}
	while (n!=0);
}

void Menu::MenuWrite()
{
	cout << "1 - Sor feltoltese " << endl;
	cout << "2 - Sor kiirasa " << endl;
	cout << "3 - Masodik sor hozzafuzese az elsohoz " << endl;
	cout << "0 - Kilepes " << endl;
}

void Menu::Insert()
{
	int i;
	string str;
	cout << "Kerem a lista elemeit: ";
	cin >> str;
	//Node();
	while (!((i=atoi(str.c_str()))==0 && str!="0"))
	{
		sor.Insert(i);
		cin >> str;
	}
}

void Menu::Write()
{
	for (sor.First(); !sor.End(); sor.Next())
	{
		cout << sor.Current() << " ";
	}
	cout << endl;
}

void Menu::Union()
{
	
}

//sequence.h
#ifndef SEQUENCE_H
#define SEQUENCE_H

#include <iostream>
#include "node.h"

class Sequence
{
public:
		Sequence();
		//Sequence(const Sequence& s);
		//Sequence& operator=(const Sequence& s);
		//~Sequence();

		void Insert(int e);
		
		int Current() const { return current->value; }
		void First()        { current = first; }
		bool End()    const { return current==NULL; }
		void Next()         { current = current -> next; }
		bool Empty()  const { return head->next== NULL; }

private:

		Node *first;
		Node *last;
		Node *current;
		Node *head;

};

#endif

//sequnce.cpp
#include <iostream>
#include "sequence.h"
#include "node.h"

using namespace std;

Sequence::Sequence()
{
	Node *head = new Node();
	head->prev = head->next = head;
	first = NULL;
	last = NULL;
	current = NULL;
}

void Sequence::Insert(int e)
{
		Node *p = new Node(e, last, NULL);
		if (last!=NULL) last->next = p;
		last = p;
		if (first==NULL) first = p;
		
}

//node.h
#ifndef NODE_H
#define NODE_H

#include <iostream>

class Node
{
public:
	int value;
	Node *next;
	Node *prev;
	Node (int value = 0, Node *prev = 0, Node *next = 0)
	{
		this->value = value;
		this->prev = prev;
		this->next = next;
	}
};

#endif

at parancsok c -bol telonak

Fórumok

Hi urak!
Kellene irjak egy kis progit, ami kezelne egy telefont at parancsok segitsegevel soros porton.
Igazabol nemi segitseg kellene, hogy merre induljak el.
Milyen telefont vegyek ? Tok mindegy ?
Nemi tapasztalat ha mar valaki (biztos) csinalt ilyet.

elore is koszonom
Zsomi

Platformfuggetlen audio in/out

Fórumok

Udv!

Szeretnek irni egy olyan platformfuggetlen (de legalabb konnyen portolhato) programot, ami hangot is fogad, illetve kuld a hangszorora. (egyelore semmi komoly, Fourier terben probalnek ki par dolgot)
SDL-t mar hasznaltam, es tetszett is, de egyelore mikrofont meg nem kepes kezelni. 44,1 kHz/16 bites modban hasznalnam, a mikrofont mono, a hangszorot sztereo modban, egyidejuleg.
Linux alatt alsa+arts fut, de jo lenne, ha win alatt is futna a vegen a program.
A kerdesem az lenne, hogy milyen platformfuggetlen libbel lehet ezt megoldani? Letezik erre valamilyen wrapper, vagy kezzel kell mindket APIra implementalni ugyanazt?
Van valami tutorial, hogy hol erdemes ezt elkezdeni?

Nyos

clock() probléma

Fórumok

Szeretném egy programrészlet futásidejét mérni (másodpercben). A következőket próbáltam:


clock_t t1=clock();
...
egyéb utasítások
...
clock_t t2=clock();

masodperc=(t2-t1)/CLOCKS_PER_SEC;

A probléma az, hogy a t1, t2 csak long értéket (úgy tudom, hogy clock_t is long(?), ill. a clock() long-al tér vissza) hajlandó elfogadni, amivel nem sokra megyek, mert nem tudok vele osztani legalábbis nekem nem ad tizedestörtet az itt is látható kódrészlet utolsó sora, ill. ha 1-nél kisebb, 0-nak veszi. Több helyen láttam kényszerített típuskonverziós megoldásokat, mint pl:


masodperc=((double)(t2-t1))/CLOCKS_PER_SEC;

vagy:

masodperc=((double)(t2-t1)/CLOCKS_PER_SEC);

de nekem nem működtek, ill. ha ezek nélkül próbéltam akkor a már leírt jelenséget muatta, ezzel pedig (ebben az esetben a "masodperc" változó értelemszerűen double) lehetetlen (pl. negatív) értékeket adott.

Van esetleg valakinek ötlete, mi lehet a hiba?

Párhuzamos port vezérlése

Fórumok

Üdv!

Az a problémám, hogy szeretnék néhány egyszerűbb vezérlést megvalósítani párhuzamos portra. Ehhez szükségem lenne az adat be/kivitelre, de sehogy sem akar összejönni. Megnéztem ezt: http://hup.hu/node/18950 nálam nem működtek az ott leírt dolgok. Aztán ezt: http://www.codexonline.hu/CodeX2/alap/notjsbeg/lpt02.htm , ebben assembly betétekkel próbálkoznak, de arra meg azt adja vissza a gcc, hogy


proba2.c: In function ‘main’:
proba2.c:7: error: expected ‘(’ before ‘in’
proba2.c:7: error: ‘in’ undeclared (first use in this function)
proba2.c:7: error: (Each undeclared identifier is reported only once
proba2.c:7: error: for each function it appears in.)
proba2.c:7: error: expected ‘;’ before ‘al’

Igazából azt sem tudom, hogy működik az assembly, csak beszúrtam azt a sort, amit ott találtam, de nem értem pl. azt se, hogy pl. a beolvasott adat milyen változóba kerül?

Valami olyan egyszerű dolgot szeretnék, ami pl. basicben valahogy így néz ki:

kivitel:

 ki(adat,port száma)

beolvasás:

változó=be(port száma)

Erre van esetleg valakinek ötlete?

c, shared memory NEM MEGY!

Fórumok

Sziasztok!

Nem nagyon szoktam ilyet kérni, de úgy látszik most rákényszerülök. Akinek van egy kis ideje, és készített már shared memory-s programot, légyszíves nézze, meg hogy mit szúrok el! Előre is nagyon köszönöm!Először létrehozom a megosztott memória területet.


size = ( (a+1) + a*(a+1) + a*a*(b+1) ) * sizeof(float*) + (a*a*b*(b+1)) * sizeof(float);
if ((id = shmget(IPC_PRIVATE, size, IPC_CREAT | 0666)) < 0)
{
  printf("Hiba a megosztott memória lefoglalása közben (méret: %d Byte)\n", size);
  return -1;
}

Erre a területre egy nagy a*a-s mátrix (2d tömb) kerül, melynek minden eleme egy b*b-s kisebb mátrix (2d tömb ez is). Minden tömb NULL-al lesz lezárva, kivéve az utolsót amiben a számok vannak, az FLT_MAX_EXP-el (ez egy konstans a legnagyobb float-ra).

Ekkor fork()-olok, és exec-el elindítom többször ugyanazt a programot (ezek fogják a mátrixokat szorozgatni). A program megkapja argumentumként az shmget() által visszaadott azonosítót.

A fork() után, még mindig a főprogramban felcsatolom a memóriát, és létrehozom a megfelelő pointer struktúrát a 4 dimenziós tömb tárolásához.


if ((matrix = shmat(id, 0, 0)) == (pMATRICES)-1)
{
  printf("Hiba a megosztott memória felcsatolása közben.\n");
  return NULL;
}

for (i=0; i<a; i++)
{
  step = ( (a+1) + i*(a+1) ) * sizeof(float*);
  matrix[i] = (float***)(matrix + step);
  for (j=0; j<a; j++)
  {
    step = ( (a+1) + a*(a+1) + i*a*(b+1) + j*(b+1) ) * sizeof(float*);
    matrix[i][j] = (float**)(matrix + step);
    for (k=0; k<b; k++)
    {
      step = ( (a+1) + a*(a+1) + a*a*(b+1) ) * sizeof(float*) + ( i*a*b*(b+1) + j*b*(k+1) + k*(b+1) ) * sizeof(float);
      matrix[i][j][k] = (float*)(matrix + step);
      for (l=0; l<b; l++)
      {
        if (matrix[i][j][k][l] == FLT_MIN_EXP)
        {
          printf("Hiba, már inicializált terület (matrix[%d][%d][%d][%d]: %p)\n", i, j, k, l, &matrix[i][j][k][l]);
          return NULL;
        }
        else
        {
          matrix[i][j][k][l] = FLT_MIN_EXP;
        }
      }
      matrix[i][j][k][b] = FLT_MAX_EXP;
    }
    matrix[i][j][b] = NULL;
  }
  matrix[i][a] = NULL;
}
matrix[a] = NULL;

Ha ez sikerült, akkor szemaforral jelzek, az eddig a jelzésig várakozó, az előbb indított processzeknek. Erre ők felcsatolják a megosztott memóriát (az id-t argumentumként kapták meg)


if ((R = shmat(Rid, 0, 0)) == (pMATRICES)-1)
{
  printf("[#%d] Hiba az R mátrixhoz tartozó megosztott memória felcsatolása közben. Kilépés.\n", num);
  return 1;
}

És végül csak próba képen megpróbálok olvasni a mátrixból:


printf("[#%d] Hello Világ! Én vagyok a(z) %d számú virtuális processzor.\n", num, num);
printf("%g\n", R[0][0][0][0]);

Erre a főprogram (aki wait()-el vár) azt tapasztalja, hogy a gyerekfolyamatok befejeződtek, és 139-es hibakódot adnak vissza. Guglizás után arra jutottam, hogy ez Segmention Violation, vagyis valami olyasmi, hogy olyan memóriaterületet akartam elérni ami nem az én címtartományomhoz tartozik. A shm-nek nem pont ez lenne a célja?

Remélem valaki meglátja, hogy mit szúrtam el, mert én már nagyon kifogytam az ötletekből. Előre is nagyon köszönök minden ötletet!

Taki

Méltó megemlékezés március 15-ről

Fórumok

/*
 *    Kokárda - az expal.c (Allegro csomag, http://allegro.cc) átirata.
 *    (c) 2007 Martinek Vilmos <m2marvil@radnoti-szeged.sulinet.hu>
 *    Fordítás: gcc -o kokarda kokarda.c `allegro-config --libs`
 *    Közreadja: Kovács Zoltán <kovzol@gmail.com>, Vilmos tanára
 */

#include <allegro.h>

int main(void)
{
   PALETTE palette;
   RGB temp;
   int c;

   if (allegro_init() != 0)
      return 1;
   install_keyboard(); 
   if (set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0) != 0) {
      if (set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0) != 0) {
         allegro_message("Hiba: %s\n", allegro_error);
         return 1;
      }
   }

   set_palette(black_palette);

   acquire_screen();

   for (c=255; c>0; c--)
      circlefill(screen, SCREEN_W/2, SCREEN_H/2, c, c);

   release_screen();

   install_mouse();
   show_mouse(screen);

   for (c=0; c<85; c++) {
      palette[c].r = 255;
      palette[c].g = 0;
      palette[c].b = 0;
   }
  
   for (c=86; c<171; c++) {
      palette[c].r = 0;
      palette[c].g = 255;
      palette[c].b = 0;
   }
   for (c=172; c<256; c++) {
      palette[c].r = 255;
      palette[c].g = 255;
      palette[c].b = 255;
   }

   while (!keypressed()) {
      temp = palette[255];
      for (c=255; c>0; c--)
         palette[c] = palette[c-1];
      palette[0] = temp;
      set_palette(palette);
   }

   return 0;
}

END_OF_MAIN()

Egy 7. osztályos (igen tehetséges) tanítványom csinálta, átírva egy Allegro mintaprogramot. A kód innen is letölthető.

/dev/dsp buffer beállítása

Fórumok

Sziasztok!

Van egy kis problémám... egy hanglejátszó programocskát készítek, mely - ebben a pillanatban még csak - beolvas egy wav file-t, beállítja a /dev/dsp-t ioctl segítségével, majd rálöki a nyers hangot.
Ezzel nincs semmi problémám, a gondom a hangkártya buffer beállításánál van, ugyanis a hangkari kb 3 mp-nyi hanganyagot elbufferel, ami azt jelenti, hogy a lejátszás után még 3 mp-ig zenél a drága...
Tud abban nekem valaki segíteni, hogy c alatt hogyan lehet beállítani egy file bufferelését?

Előre is köszi

S81