Schrift
[thread]1135[/thread]

Ganze Zeile einlesen incl. Leerzeichen: ANSI C (Seite 2)



<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
format_c
 2005-11-18 19:01
#11282 #11282
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=esskar,18.11.2005, 17:43]klar

wenn du delete [] temp aufrufst, teigt temp ja nicht mehr auf den speicherbereich, denn du mit new angelegt hast, sondern auf woerter[x]
...[/quote]
Ich dachte das wäre der Sinn von delete. Klar versuche ich es zu umgehen wenn ich es nicht brauche. Im Moment ist das schon ziemlich Misch masch. Bin auch lieber für Einheitlichkeit. Wie wäre es denn wenn ich sowas für new und delete für C verwenden wollte?

Gruß Alex
format_c
 2005-11-18 21:54
#11283 #11283
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Super danke esskar. Jetzt funktioniert alles so wie es soll. was mich jetzt noch interessieren wuert ist, wie man new und delete in C realisieren wuerde.

Gruß Alex
betterworld
 2005-11-19 02:07
#11284 #11284
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
man malloc
esskar
 2005-11-19 02:53
#11285 #11285
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
und man free
format_c
 2005-11-19 16:11
#11286 #11286
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Och menno,
so richtig wills noch nicht.
Ich hab in meiner Funktion die eine art join - Funktion ist versucht das ueber statische pointer zu machen aber da gibts auch nur trouble. jetzt hab ich das mit malloc probiert wobei ich dabei nicht weis wie ich da das free einbauen soll.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
char * join(char ** woerter,int anzahl,char * str) {
int letter_count=0;
int sl=strlen(str);
for (int i=0;i<anzahl;i++) {
letter_count+=strlen(woerter[i]);
if (i<anzahl-1)
letter_count+=sl;
}
char * pstr=malloc(sizeof(char)*(letter_count+1));
if (pstr==NULL)
exit(1);//Error to allocate Memory
char * joined=pstr;
for (int i=0;i<anzahl;i++) {
char * wp=woerter[i];
int wl=strlen(wp);
for (int j=0;j<wl;j++) {
*pstr=*wp;
pstr++;
wp++;
}
if (i<anzahl-1) {
char * sp=str;
for (int k=0;k<sl;k++) {

*pstr=*sp;

pstr++;

sp++;
}
}
}
*pstr=0;
return joined;
}


Da sagt er mir, dass er nicht void * zu char * convertieren koenne. Auf wikipedia stehts aber so als beispiel mit int da.

Und wenn ich es statisch versuche sagt er mir immer non-lvalue in assignment ???? Was mir auch immer diese Fehlermeldung sagen soll.
Hier der Code mit dem Statischen Versuch.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
char * join(char ** woerter,int anzahl,char * str) {
int letter_count=0;
int sl=strlen(str);
for (int i=0;i<anzahl;i++) {
letter_count+=strlen(woerter[i]);
if (i<anzahl-1)
letter_count+=sl;
}
char pstr[letter_count+1];
char * joined=pstr;
for (int i=0;i<anzahl;i++) {
char * wp=woerter[i];
int wl=strlen(wp);
for (int j=0;j<wl;j++) {
*pstr=*wp;
pstr++;
wp++;
}
if (i<anzahl-1) {
char * sp=str;
for (int k=0;k<sl;k++) {

*pstr=*sp;

pstr++;

sp++;
}
}
}
*pstr=0;
return joined;
}


Sorry dass ich schon wieder nerve. ich hoffe ich peil's irgendwann.

Gruß Alex
betterworld
 2005-11-19 19:28
#11287 #11287
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Erstmal zu dem zweiten Code: Das ist nicht statisch. Das array pstr bekommt eine Länge, die erst zur Laufzeit bekannt ist. Würde mich wundern, wenn ein Ansi-C-Compiler das schluckt. Ebenso sollten in Ansi-C die Deklarationen nur an Anfängen von Blöcken stehen.

Zum ersten Code: Versuch doch mal, von Hand zu casten:
Code: (dl )
pstr=(char*)malloc(sizeof(char)*(letter_count+1));


Nächstes Mal bitte nur relevanten Code posten (also ein minimiertes Beispiel), und die Zeilennummern der Fehlermeldungen.
esskar
 2005-11-19 21:01
#11288 #11288
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
char *join(const char **woerter, int anzahl, const char *sep) {
   char *retval = NULL, *wort = NULL;
   int seplen = 0, wortlen = 0, size = 0, len = 0;

   if(woerter == NULL || anzahl == 0 || sep == NULL)
       return NULL;    

   seplen = strlen(sep);
   wort = *woerter++;
   while(anzahl > 0 && wort != NULL) {
       wortlen = strlen(wort);
       size += wortlen + 1;
       if(anzahl > 0) size += seplen;
             
       if(retval == NULL) retval = (char *)malloc(size);
       else retval = (char *)realloc(retval, size);

       strncpy(retval + len, wort, wortlen);
       len += wortlen;
       if(anzahl > 0) {
           strncpy(retval + len, sep, seplen);
           len += seplen;
       }
       wort = *woerter++; --anzahl;        
   }

   return retval;
}


Quote
da sagt er mir, dass er nicht void * zu char * convertieren koenne


das beweisst mal wieder, dass entweder keinen C compiler (sondern eine C++ compiler) benutzt oder du deinem C++ compiler nicht sagst, dass er den code als C code interpretieren soll.\n\n

<!--EDIT|esskar|1132427007-->
format_c
 2005-11-20 03:12
#11289 #11289
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Danke für den Code. Der sieht sehr vernünftig aus im Gegensatz zu meinem. Dass mein Compiler nicht weis, dass er C kompilieren soll kann natürlich sein weil ich das mit Xcode mache und damit noch nicht so fit bin wie mit C an sich auch.

Gruß Alex
esskar
 2005-11-20 05:57
#11290 #11290
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=format_c,20.11.2005, 02:12]Danke für den Code. Der sieht sehr vernünftig aus im Gegensatz zu meinem.[/quote]
du kanntest realloc nur nicht ( ein feature, dass ich in C++ vermisse, da es dort nur new und delete gibt)
Dubu
 2005-11-20 15:50
#11291 #11291
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Was noch fehlt sind ein paar Sicherheitsabfragen, ob malloc() bzw. realloc() denn funktioniert haben.
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2005-11-17 14:27.