• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[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:
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
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:

deSk

Neu angemeldet

Registriert
14 Feb. 2014
Beiträge
28
  • 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]
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
was passiert den in der Funktion...kannst du den Code davon auch posten?

el = addList(el,&anzZ);
 

deSk

Neu angemeldet

Registriert
14 Feb. 2014
Beiträge
28
  • 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]
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
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
 

deSk

Neu angemeldet

Registriert
14 Feb. 2014
Beiträge
28
  • Thread Starter Thread Starter
  • #7
habe es rausgemacht und keine Abstürze
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
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?
 

deSk

Neu angemeldet

Registriert
14 Feb. 2014
Beiträge
28
  • Thread Starter Thread Starter
  • #9
habe sie bis 11 gefüllt ,erste ausgabe 6 (was auch richtig ist) zweite ausgabe 9 und dritte 13
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
mit welchen Werten hast du

current_LCount
anzZ

initialisiert?


oder poste mal die ganze main-Funktion
 

deSk

Neu angemeldet

Registriert
14 Feb. 2014
Beiträge
28
  • 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.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
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]
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
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"?
 

deSk

Neu angemeldet

Registriert
14 Feb. 2014
Beiträge
28
  • 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
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
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

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
@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.
 

deSk

Neu angemeldet

Registriert
14 Feb. 2014
Beiträge
28
  • 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.
 
Oben