Undefined reference

Also du definierst eine struct IntArray, die nur eine int-Variable besitzt. Das bedeutet die sollte zum Beispiel 4 Byte groß sein. Du kannst nicht einfach einen Zeiger von IntArray auf freien Speicher zeigen lassen. Du solltest in der struct IntArray einen Zeiger erstellen, der auf freien Speicher zeigt.
So wie du es jetzt machst zeigt der IntArray-Pointer auf freien Speicherplatz, interpretiert diesen Speicherplatz aber als IntArray! Das bedeutet die ersten 4 Bytes des reservierten Speichers sind für den Compiler die Variable laenge und der Rest nur freier Speicher ohne Bedeutung.
Wie gesagt: Ein Pointer im IntArray zeigt auf freien Speicher und das Problem sollte gelöst sein.

Lg
 
Aber ist das dann nicht doppelt zu erzeuge_Intarray wenn ich in der struct zusätzlich einen Pointer auf freien Speicherplatz erstelle?
 
Nein, dein IntArray sollte einen int-Pointer beinhalten und eine int-Variable für die Länge. In erzeuge_intarray() sollte dann der int-Pointer aus der struct auf den freien Speicherplatz zeigen.
Zuerst hast du einen Pointer von IntArray auf den Speicherplatz zeigen lassen, das ist aber unsinnig. Auf den Speicherplatz sollte der int-Pointer zeigen.

Lg
 
Sorry, wenn ich so blöd frage, aber dir ist schon klar, dass es
a) ein int-Array (etwas anders als deines) schon fertig gibt
b) statt *(array+index) kann man auch einfach array[index] schreiben

Zu dem, was du da mit ibafluss diskutierst:
a) das int in der struct sollte nicht laenge, sondern eher Wert heißen
Damit ist auch das ganze struct mit int sinnlos, weil man auch einint ohne struct herum nehmen kann.
Auch die Wertsetze-Funktion etc.ist damit sinnlos.
einArray[4] = 88;
= macht das auch

b) Dem int laenge entnehme ich (auch von ibafluss schon angedeutet),
dass es eine Schul/Uni-Aufgabe ist (eine von der extrasinnlosen Sorte)
und das ganze Array in einer struct sein soll.

Sowas:
C++:
struct IntArray
{
   int laenge;
   int *wert;
};

...
Sind die Funktionen (Rückgabewert/Parameter) so vorgegeben oder kannst du das ändern?

Noch was: Du hast nirgends ein free!
Jedes malloc braucht irgendwann wieder ein free...
 
So habe in der Header nun den int Pointer angelegt.
Nun erhalte ich Fehlermeldungen beim Dereferenzieren des Zeiges:

Code:
struct IntArray * erzeuge_intarray(int laenge){
  struct IntArrray *a = malloc(sizeof(laenge*sizeof(int)));  
  (*a)->start = a;
  a->laenge = laenge;
  return a;
}

Auch dir Danke für die Hilfe das dies noch nicht fertig ist bzgl. free etc. ist mir bewusst wollte es erst Stück für Stück realisieren.
 
(Wie schaut die struct aus?
Wo greifst du auf den Pointer zu?
Du machst noch immer ein struct-Array.
hmm, geändert.)

Welche Meldung? Wo?
 
Die Sache war so gedacht:

C++:
struct IntArray* erzeuge_intarray (int laenge)
{
       struct IntArray *a;
       a->start = malloc (laenge * sizeof (int));
       a->laenge = laenge;

       return a;
}
 
Danke euch. Jedoch der Fehler mit dem Zugriff auf das erste Feld im Array ist immer noch falsch bzw. noch da.

Eine weitere Frage warum kann ich z.B. nicht auf laenge mit a.laenge im erzeuge_intarray zugreifen?

Vielen Dank.
 
Getestet durch:
Code:
  struct IntArray *a = erzeuge_intarray(4);
  printf("Laenge: %d\n\n",a->laenge);  
  setWert(a, 1,10);
  printf("%d\n",getWert(a,1));
  setWert(a, 2,15);
  printf("%d\n",getWert(a,2));
  setWert(a, 3,20);
  printf("%d\n",getWert(a,3));
  setWert(a, 1,25);
  printf("%d\n",getWert(a,1));

es wurde in intarray.c nur noch

Code:
void setWert(struct IntArray *array, int index, int wert){
		array[index] = wert;		
}
int getWert(struct IntArray *array, int index){
		return array[index];		
}
hinzugefuegt. Nun ist es wie schon seit Beginn der Fehler da, wenn man das erste Feld anspricht (setzt oder abfragt das dort als Wert einfach beliebige Zahlen zurückgegeben werden.

Des Weiteren sehe ich grad einen Fehler bei setWert
Code:
		array[index] = wert;
(Fehler: unverträgliche Typen bei Zuweisung an Typ »struct IntArray« von Typ »int«) und bei getWert
Code:
		return array[index];
(Fehler: unverträgliche Typen bei Rückgabe von Typ »struct IntArray«, aber »int« wurde erwartet)

Die Beispielausgabe:

Zeile 0: Laenge: 7340228
Zeile 1: 702A10 + 268824
Zeile 2: 1
Zeile 3: 7029F0 + 15
Zeile 4: 15
Zeile 5: 7029F4 + 20
Zeile 6: 20
Zeile 7: 702A4C + 2130567168
Zeile 8: 1

Die Werte 268824, 2130567168 sowie die Zeile 2 und 8 sind nicht richtig sowie die Länge ist nicht richtig.
 
Zuletzt bearbeitet:
Zurück