[C] Problem struct Pointer zuzuweisen

deSk

Neu angemeldet
Registriert
14 Feb. 2014
Beiträge
28
Hallo liebe ngb Community,
ich habe derzeit ein langzeitiges Problem mit einen Programm.

Erstmal etwas Code :) :

Ein einfaches struct mit einen Index (nr) und einen Pointer auf den Typ char der eine Zeichenkette dynamisch speichert.
Bis hier hin alles easy :D
[src=c]
typedef struct{
int nr;
char* zk;
}ELEMENT;
[/src]

In der main() wird dann ein struct Pointer deklariert und mit NULL definiert ...
[src=c]
ELEMENT* el = NULL;
[/src]
danach folgt halt eine Eingabe über stdin (zwecks Fileumlenkung) geht auch alles gut ,das Problem kommt erst beim Sortieren...ich sortiere die Liste von Typ struct ELEMENT lexiogr. (also anhand von zk) per Bubblesort.

[src=c]
ELEMENT* bSort(ELEMENT* list,int size){
int i = 0;
int warSortiert = TRUE;
ELEMENT* tmp=(ELEMENT*)calloc(1,sizeof(ELEMENT));
do{
warSortiert = TRUE;
for(i = 0;i < size-1;i++){
if(strcmp(list.zk,list[i+1].zk)>0){
tmp = list; //FEHLER struct ELEMENT* -> struct ELEMENT
list = list[i+1];
list[i+1] = tmp; // hier das gleiche
warSortiert = FALSE;
}
}
}while(warSortiert == FALSE);
return list;
}
[/src]
Der Fehler kommt nur bei tmp = list; und list[i+1] = tmp;

Compilerfehlermeldung:
[src=text]
...\main.c|93|error: incompatible types when assigning to type 'struct ELEMENT *' from type 'ELEMENT'|
...\main.c|95|error: incompatible types when assigning to type 'ELEMENT' from type 'struct ELEMENT *'|
[/src]

Ich hoffe ihr könnt mir helfen :) ,geht mir wirklich nur um die Zuweisung...ich denke das Problem ist so Trivial...aber ich erkenn ihn einfach nicht :( nervig...
Vielen Dank schonmal :beer:
 
dein Code ergibt mom keinen Sinn. Hast du eine Liste??? Oder ein Array? Ich gehe mal von einem Array aus. Dann musst du auch einen solchen übergeben.

Änderungen

ELEMENT* list[]
list[i+1]->zk


[src=c]
ELEMENT* bSort(ELEMENT* list[],int size){
int i = 0;
int warSortiert = TRUE;
ELEMENT* tmp=(ELEMENT*)calloc(1,sizeof(ELEMENT));
do{
warSortiert = TRUE;
for(i = 0;i < size-1;i++){
if(strcmp(list->zk,list[i+1]->zk)>0){
tmp = list; //FEHLER struct ELEMENT* -> struct ELEMENT
list = list[i+1];
list[i+1] = tmp; // hier das gleiche
warSortiert = FALSE;
}
}
}while(warSortiert == FALSE);
return list; /*** hier kommt nun eine Warnung *******/
}[/src]


Am besten ist, wenn du den Code oben nicht nimmst. Weil er keinen Sinn ergibt. Da du die Konzepte einer Liste und Arrays durcheinander bringst. Entscheide dich für eines von beiden. Wie sieht den das einfügen aus wahrscheinlich liege ich falsch..
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #3
Hallo @evillive danke für deine Antwort =)
Ja hab noch ein kleinen Teil vergessen und zwar ist es eine Liste und kein Array

Hier das füllen der Liste über stdin:
[src=c]
/*.....includes und sonstiges.....*/
#define MAXL 8
#define MAXS 50
/*.....weitere Code....*/
el = (ELEMENT*)calloc(MAXL,sizeof(ELEMENT));
buffer = (char*) calloc(MAXS,sizeof(char));

printf("Eingabe: \n");
while(fgets(buffer,MAXS,stdin) != NULL){
if(current_LCount > anzZ-1){
el = addList(el,&anzZ);
/*return UTEST_;*/
}
if(buffer[strlen(buffer)-1] == '\n')
buffer[strlen(buffer)]='\0';

el[current_LCount].nr = current_LCount+1;
el[current_LCount].zk = (char*)calloc(strlen(buffer)-1,sizeof(char));
strcpy(el[current_LCount].zk ,buffer);

current_LCount++;
}
[/src]
 
was passiert den in der Funktion...kannst du den Code davon auch posten?

el = addList(el,&anzZ);
 
  • Thread Starter Thread Starter
  • #5
Klar gerne :) aber er ist wahrscheinlich etwas blöd zwecks der Laufzeit...ich nehm viele Algorithmen aus den Algorithmen und Datenstrukturen Vorlesungen :D

[src=c]
ELEMENT* addList(ELEMENT* l,int *size){
int a = 0;
int osize = *size;
ELEMENT* tmp = (ELEMENT*)calloc(osize,sizeof(ELEMENT));


//
for(a = 0; a < osize; a++){
tmp[a].nr = l[a].nr;
tmp[a].zk = (char*)calloc(strlen(l[a].zk),sizeof(char));
strcpy(tmp[a].zk,l[a].zk);
}

*size = (int)((3*osize)/2);


l = (ELEMENT*)calloc(*size,sizeof(ELEMENT));

for(a = 0; a < osize; a++){
l[a].nr = tmp[a].nr;
l[a].zk = (char*)calloc(strlen(tmp[a].zk),sizeof(char));
strcpy(l[a].zk,tmp[a].zk);
}

return l;
}
[/src]
 
mach mal bSort() raus .. funktioniert dann dein Programm? Oder stürtzt es ab?

also hier stürtzt er ab
el[current_LCount].nr = current_LCount+1;

ok hatte was vergessen
 
  • Thread Starter Thread Starter
  • #7
habe es rausgemacht und keine Abstürze
 
ok wenn du nach dem Aufruf von addList() folgendes einbaust

printf("anzZ: %d\n",anzZ);

kommt dann immer 0 (wie bei mir) ?

bzw mit was ist anzZ initialisiert?
 
  • Thread Starter Thread Starter
  • #9
habe sie bis 11 gefüllt ,erste ausgabe 6 (was auch richtig ist) zweite ausgabe 9 und dritte 13
 
mit welchen Werten hast du

current_LCount
anzZ

initialisiert?


oder poste mal die ganze main-Funktion
 
  • Thread Starter Thread Starter
  • #11
Oke

hier die vllständige main():
[src=c]
int main(){
int current_LCount = 0;
int anzZ = MAXL ;
ELEMENT* el = NULL;
char* buffer = NULL;


el = (ELEMENT*)calloc(MAXL,sizeof(ELEMENT));
buffer = (char*) calloc(MAXS,sizeof(char));

printf("Eingabe: \n");
while(fgets(buffer,MAXS,stdin) != NULL){
if(current_LCount > anzZ-1){
el = addList(el,&anzZ);
printf("anzZ:%d",anzZ);
/*return UTEST_;*/
}
if(buffer[strlen(buffer)-1] == '\n')
buffer[strlen(buffer)]='\0';

el[current_LCount].nr = current_LCount+1;
el[current_LCount].zk = (char*)calloc(strlen(buffer)-1,sizeof(char));
strcpy(el[current_LCount].zk ,buffer);

current_LCount++;
}

print(el,current_LCount);

//Bis hier hin funktioniert alles
//return UTEST_;
//
//el = bSort(el,current_LCount);
print(el,current_LCount);
return 0;
}
[/src]
Kurzer Hinweis : MAXL = 8 und MAXS = 50,dabei ist MAXL die anfängliche maximale Größe der Liste und MAXS die maximale größe der Zeichenketten (el.zk und buffer)
Ich habe aber da schon alles getestet und es gab dabei keine Probleme ,es geht wirklich nur um die bSort - Funktion.
 
addList ergibt irgendwie keinen Sinn... irgendwie machst du da schon Sachen, die du schon in der while-Schleife gemacht hast. Schau mal ob du damit weiter arbeiten kannst.


[src=c]
ELEMENT* bSort(ELEMENT* list,int size){
int i = 0;
int warSortiert = TRUE;
ELEMENT tmp;
do{
warSortiert = TRUE;
for(i = 0;i < size-1;i++){
if(strcmp(list.zk,list[i+1].zk)>0){
tmp = list;
list = list[i+1];
list[i+1] = tmp;
warSortiert = FALSE;
}
}
}while(warSortiert == FALSE);
return list;
}

int main(){
int current_LCount = 0;
ELEMENT* el = NULL;
char* buffer = NULL;
int i = 0;

el = (ELEMENT*)calloc(MAXL,sizeof(ELEMENT));
buffer = (char*) calloc(MAXS,sizeof(char));

printf("Eingabe: \n");
while(current_LCount < MAXL && fgets(buffer,MAXS,stdin) != NULL){
if(buffer[strlen(buffer)-1] == '\n')
buffer[strlen(buffer)]='\0';

el[current_LCount].nr = current_LCount + 1;
el[current_LCount].zk = (char*) calloc(strlen(buffer)-1,sizeof(char));
strcpy(el[current_LCount].zk ,buffer);
current_LCount++;
}
//bSort

return 0;
}[/src]
 
Wenn du ein Minimalbeispiel hinshreibst gibts vermutlich auch mehr Antworten.
Hab mir den ganzen Algo Kram nicht angeschaut, aber die Zeilen mit den Fehlermeldungen.. der Compiler sagt dir doch, was da schief geht.
Du versuchst etwas vom Type ELEMENT* zuzuweisen was aber vom Typ ELEMENT ist und umgekehrt. Woran liegt das nun? Siehe Pointer/Array.
Das solltest du dir nochmal angucken wenn dir nicht klar ist was das Problem ist.
Welchen Typ hat "tmp", welchen "list" und welchen "list"?
 
  • Thread Starter Thread Starter
  • #14
Hallo,
erstmal vielen Dank für deine Hilfe evillive ,habe aber die addList()-Funktion drin gelassen. Ja der Name der Funktion ist einfach nur dumm gewählt ,aber die Funktion erweitert die Liste indem sie alles in eine zweite tmp Liste speichert dann größeren Speicherplatz reserviert (derzeitige Länge * 3 / 2) und wieder mit den Daten der tmp Liste füllt.

@BurnerR darum gings mir die ganze Zeit ,ich verstehe was Pointer und Arrays sind. Habe aber nur noch nie damit im Zusammenhang von structs gearbeitet.

Problem ist aufjeden Fall gelöst :) ich danke euch beiden
 
axo jetzt wird mir klar was du in addList machen wolltest.

Entweder du nimmst eine richtige Liste oder wenn du es so machen willst, wie du es machst dann musst du diese Funktion anpassen.

Aus tmp machst du dein neues Array, welches du dann mit zurück gibst (return newList). vorher musst du noch den reservierten Arbeitsspeicher wieder freigeben.

Wenn du calloc() aufrufst musst du prüfen ob genug Arbeitsspeicher zur verfügung stand ... und wenn du calloc aufgerufen hast, dann muss irgendwann mit free der Arbeitsspeicher freigegeben werden. Nicht alle Betriebssystem sorgen sich darum, daher musst du immer am Ende des Programms den Speicher freigeben.

[src=c]
ELEMENT* addList(ELEMENT* l,int *size){
int a = 0;
int osize = *size;
ELEMENT* newList = ... calloc (3*osize)/2
if(NULL == zahlen) {
printf("Kein virtueller RAM mehr vorhanden ... !");
return EXIT_FAILURE;
}

for(a = 0; a < osize; a++){
newList [a].nr = l[a].nr;
newList [a].zk = (char*)calloc(strlen(l[a].zk),sizeof(char));
strcpy(newList [a].zk,l[a].zk);
}

free(l); /// <---- Arbeitsspeicher freigeben ... sonst liegt der Inhalt der alten Liste die ganze Zeit im Arbeitspeicher..


return newList;
}


int main() {

free( .... ) // TODO reservierten Speicher wieder freigeben!!!!
return 0;
}
[/src]
 
@BurnerR darum gings mir die ganze Zeit ,ich verstehe was Pointer und Arrays sind. Habe aber nur noch nie damit im Zusammenhang von structs gearbeitet.
C ist zwar schon etwas her, aber ich sehe da keinen notwendigen Zusammenhang zu structs.

Siehe z.B. analog zu deiner Frage dieses Programm
[src=c]
#include <stdio.h>
#include <stdlib.h>

int main(void) {

int list[3] = {2,4,6};
int* tmp = NULL;

tmp = list;
printf("%d", tmp[1]);

tmp = list[1]; // warning: assignment makes pointer from integer without a cast
printf("%d", tmp[1]); // speicherzugriffsfehler


return EXIT_SUCCESS;
}

[/src]
Hier gibts nicht mal mehr einen Fehler vom Compiler weil ich integer als Datentyp verwendet habe, sprich du hast "Glück" das ein cast von ELEMENT* nach ELEMENT und umgekehrt natürlich nicht geht.
 
  • Thread Starter Thread Starter
  • #17
@evillive ja ich habe vergessen den Speicher wieder freizugeben ,ist aber jetzt drin :) Nochmals danke für deine große Hilfe.
 
Zurück
Oben