c-code in xcode kompiliert läuft anders als in visual studio kompiliert!?!

N

Nuuk

Aktives Mitglied
Thread Starter
Dabei seit
13.04.2003
Beiträge
289
Reaktionspunkte
2
mich macht xcode gerade wahnsinnig.
ich versuch grad stundenlang ein nicht sonderlich komplexes programm (in c) für die informatik vorlesung zu schreiben und bekomm es einfach nicht hin. (der debugger begeistert mich mit seiner anwesenheit, verkettete listen werden scheinbar nicht richtig erstellt, zum teil aber wieder doch)
jetzt hab ich aus voller verzweiflung die einzelnen teile des codes in visual studio importiert und siehe da, das programm läuft ganz anders ab.
plöztlich funktionieren meine eingebauten fehlermeldungen und alles erscheint zum ersten mal ansatzweise logisch.
was soll das?
xcode kann doch billigen c code nicht so viel anders kompilieren, wie visual studio, oder doch???
 
Kommt auf den c-code an ;)
 
wenn es in visual studio compiliert, scheinst du ja eher M$ c-code geschrieben zu haben ;)
 
Ich denke auch das Du dich nicht an die C-Standards gehalten hast. Kannst den Code ja mal Posten
 
na dann will ich doch mal code posten:

das ist die funktion:

Code:
void einfuegenListe (ProdListe ** liste, ProdInfo * produkt)
{
	/* Angegebenes Produkt wird in die gegebene Liste eingefuegt */
	while((*liste)!=NULL)
	{
	(*liste)=(*liste)->next;
	}
	
	if ((*liste)==NULL)
	{
	(*liste)=malloc(sizeof(ProdListe));
	(*liste)->info=produkt;
	printf("liste erstellt! kontrolle: %s %f\n",(*liste)->info->name, (*liste)->info->preis);
	}
	else
	printf("ERROR!!!!!!!!!!!");
}

und die 2 struct definitionen:

Code:
typedef 
	struct prodliste {
		ProdInfo * info;
		struct prodliste * next;

Code:
typedef 
	struct prodinfo { char name [20];
					  double preis;
	}
ProdInfo;


es geht darum, dass die daten aus produkt in die liste eingefügt werden. die nächste lieste soll dann in einem ringpuffer mit der vorherigen verkettet sein.
xcode führt den code oben problemlos aus, bringt dann erst wenn man erneut auf die daten zugreifen will den debugger.
visual studio bringt schon beim code oben fehler.
seltsam find ich das... aber ich hab ja auch keine ahnung :rolleyes:

was mir noch seltsam an xcode erscheint ist der fall einer endlosschleife. xcode führt dann die funktion vor der endlosschleife schon nicht mehr aus, anstatt erst die funktion vor der endlosschleife auszuführen und dann ins verderben zu rennen... komisch komisch...
wahrscheinlich auch nur ein denkfehler... :rolleyes:
 
Du schreibts in dem Code ja nie, wass (* liste)->next sein soll. Deshalb kann es sein, dass (* liste)->next je nach Betriebssystem anders gesetzt wird.
Der Algorithmus muss so sein:
Wenn liste->next = null, dann erstelle neueListe und setze liste->next = neueListe. Sonst liste = liste->next.



Ein Fehler, der passieren kann: Verwenden con Variablen, die noch nicht gesetzt wurden:
int xAlt = 10;
int xNeu;
if (xNeu < 20) xNeu = xAlt;

statt
if (xAlt < 20) xNeu = xAlt;

Es kann sein, dass xNeu, einen Wert bekommt, der < 20 ist, dann funktioniert dein Programm. Wenn du dann irgendwo im Code was änderst (z.B. printf("test"); ist xNeu vielleicht > 20 und das Programm macht Käse.



Tobi
 
ProdListe? rotfl Hat's für ein "ukt" nicht mehr gereicht? :D
 
Außerdem darfst Du nicht davon ausgehen, daß ein Speicherbereich nach dem alloziieren zu Null initialisiert ist. Daß heißt, wenn Du Speicher für eine Struktur anforderst und in dieser Struktur sind wiederum Zeigerelemente, heißt das nicht, daß Du einen Auswertung mit NULL vornehmen kannst. Das hängt stark vom verwendeten Compiler ab.
Deshalb habe ich es mir angewöhnt, jeden angeforderten Speicher selber zu initialisieren. Ebenso nach dem Freigeben von Speicherbereichen führe ich eine explizite NULL-Zuweisung aus. Zum Beispiel mein aktueller Compiler (LabWindows/CVI) führt keine Initialisierung selbstständig durch.
Deshalb, nie von irgendwelchen Annahmen ausgehen.

Pingu
 
Du kannst ja auch mal im Terminal kompilieren.
Hier ist eine Makefile, die du verwenden kannst:
Einfach Makefile und Datei mit Code ins gleiche Verzeichnis. In der Makefile bei
PROGRAM =
den gewünschten Programmnamen eintippen
und bei
OBJS =
die Objekte, die gelinkt werden sollen, z.B. MeineDatei.o
Dann einfach "make" im Terminal eingeben und Programm starten.

Tobi
 
Außerdem funktioniert es so sowieso nicht. Meine Alternative sähe so aus:
Code:
void einfuegenListe (ProdListe ** liste, ProdInfo * produkt)
{
  struct ProdList	*_tmp;

  /* erstes Element benötigt eine Sonderbehandlung */
  if (!*liste) {

    // was tun wenn kein Speicher mehr?
    if (!(_tmp = malloc(struct ProdList))) return;

    // das neue Element initialisieren
    _tmp->info = produkt;
    _tmp->next = NULL;

    // damit die Liste auch auf das neue Element zeigt
    liste = &_tmp;

    return;

  } // if (*liste == NULL)

  // zum Ende der Liste gehen
  _tmp = *liste;
  while (_tmp->next) _tmp = _tmp->next;

  // neues Element hinzufügen

  // immer bedenken, daß der Speicher alle sein könnte
  if (!(_tmp->next = malloc(struct ProdList))) return;

  // neues Element initialisieren
  _tmp->next->info = produkt;
  _tmp->next->next = NULL;

  // das wars
  return;
}

Alternativ, könnte man das neue Element aber auch am Anfang der Liste hinzufügen:
Code:
void einfuegenListe (ProdListe ** liste, ProdInfo * produkt)
{
  struct ProdList	*_tmp;

  // was tun wenn kein Speicher mehr?
  if (!(_tmp = malloc(struct ProdList))) return;

  // das neue Element initialisieren
  _tmp->info = produkt;

  // aktuelle Liste an das neue Element anfügen
  _tmp->next = *liste;

  // neues Element als neue Liste definieren
  liste = &_tmp;

  // das wars
  return;
}


Pingu
 
danke, so langsam weiß ich warum es nicht funktioniert und wo die fehler sind.

@punguin: deinen code muss ich mir noch in ruhe anschauen. danke.
 
Zurück
Oben Unten