Frage zu C und malloc

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
falx
Beiträge: 199
Registriert: 03.03.2003 15:12:09
Wohnort: Konstanz
Kontaktdaten:

Frage zu C und malloc

Beitrag von falx » 06.06.2003 09:50:24

Hi Leute!

Hab mich unter die Programmierer begeben und versuche gerade ein add-on für den emelFM zu schreiben. Eine Gtk-Progressbar, damit man beim kopieren größerer Dateien mitbekommt, wie lange es noch dauert.

Funzt soweit auch, ABER ich weiß nicht genau wieso. :(

Zum Problem:
Ich will, falls die Datei schon existiert ein pop-up kommen lassen, das den Benutzer warnt. Bei diesem Pop-up will ich Speicher für den Text dynamisch anlegen mit malloc.

Die Funktion dazu sieht so aus:

Code: Alles auswählen

gint
warning(gchar *zielname ,gint *ow_ok)
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *label;
gchar *labeltext;

...[snip]...
labeltext = (???)malloc( ???);
sprintf(labeltext, "Die Datei\n  %s  \n existiert bereits. Überschreiben?", zielname);
label = gtk_label_new(labeltext);
...[snip]...
Kann mir jemand vielleicht helfen, was ich für die ??? einsetzen sollte?
Danke im Voraus,
falx
There are two things in the world I hate the most: People intolerant to other peoples distros... and SuSE.

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 06.06.2003 10:15:07

ich kenn zwar GTK und die ganzen Typen die da verwendet werden nicht genau, aber ich vermute malDu brauchst was in der Art (wegen solcher Probleme mag ich C++ und mag GTK nicht!)

Code: Alles auswählen

labeltext = (gchar*)malloc(strlen(zielname)+ 1+XX );
wobei XX durch die Länge von "Die Datei\n .." zu ersetzen ist.
Das '+1' wird für das abschliesende \0 gebraucht.
Labeltext sollte noch auf != 0 getestet werden, um zu sehen, ob das malloc() erfolgreich war. Schau mal nach, ob Du nicht begrenzen kannst, wieviel Zeichen sprintf() in labeltext schreiben darf. Ich hab schon seit ein paar Jahren nicht mehr reines C programmiert und diese ganzen Probleme verdrängt.

Wenn ich mir das so anschaue, beneide ich Dich nicht um nicht um die Verwendung von C.
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Benutzeravatar
jogix
Beiträge: 776
Registriert: 05.10.2002 20:08:16
Wohnort: Lampertheim
Kontaktdaten:

Beitrag von jogix » 06.06.2003 13:11:19

Bert hat geschrieben:ich kenn zwar GTK und die ganzen Typen die da verwendet werden nicht genau, aber ich vermute malDu brauchst was in der Art (wegen solcher Probleme mag ich C++ und mag GTK nicht!)
Es gibt aber auch ein C++ Interface für GTK+, nämlich GTKmm

Ich persönlich mag KDE und die Qt nicht, mir ist das alles viel zu sehr afgebläht und zu lahm.
cheers,
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra

Benutzeravatar
falx
Beiträge: 199
Registriert: 03.03.2003 15:12:09
Wohnort: Konstanz
Kontaktdaten:

Beitrag von falx » 06.06.2003 14:22:10

Hi Bert!

Danke für die Antwort. So ähnlich habe ich es auch, wobei ich mich frage, warum

Code: Alles auswählen

strlen(zielname)+ 1+XX
ausreicht. Warum nicht

Code: Alles auswählen

sizeof(gchar)*strlen(zielname)+...
?
Ich meine, dass nur +1 nicht klappt (zumindest hat es dass nicht), weil da nur ein byte reserviert wird, ich aber für char 4 brauche. Ergo:

Code: Alles auswählen

1*sizeof(gchar)
oder

Code: Alles auswählen

1*sizeof(gchar *)
(keine Ahnung, welches da richtig ist.)

Dennoch hat sich das Problem in sofern erledigt, da im Quelltext vom emelFM von vornherein solche Labeltexte mit labeltext[MAX_LEN] deklariert werden (MAX_LEN = 1024), so dass ich diese Art übernehmen werde, da ich später je mal meine eigene emelFM-Version basteln will.

Ich mag GTK und von daher habe ich mir gedacht: Verbesserts mal den emel. Da der nun mal in C geschrieben ist, hab ich mich jetzt an C gemacht, aber C++ wird in absehbarer Zeit folgen.

@jogix: Hab auch kein Qt drauf. Schlank is mir halt lieber.
There are two things in the world I hate the most: People intolerant to other peoples distros... and SuSE.

Benutzeravatar
Dookie
Beiträge: 1104
Registriert: 17.02.2002 20:38:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von Dookie » 06.06.2003 15:12:44

Hi falx,

Code: Alles auswählen

sizeof(gchar)*(strlen(zielname)+1)
sollte klappen, ist abernicht getestet. Ansonsten gilt punkt vor strich.


Gruß

Dookie

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 06.06.2003 15:51:56

Ok. Punkt an Euch. Das man noch mal sizeof(gchar) nehmen muß hatte ich einfach vergessen. Solch festen Felder mag ich aber gar nicht. hatte schon genug Probleme mit Code von Mitarbeitern wo munter mit festen Arrays gearbeitet wurde und und bei gelegenheit auch drüber raus geschrieben. Da bei solchen Fehlern das Programm häufig noch eine Weile weiterläuft, sind dann zu Zeitpunkt des Absturzes die wahren Ursachen fast nicht mehr zu finden. Ich da schon Tage mit der Fehlersuche zugebracht. Und die Security Meldungen sollten sollten ja überzeugend sein, nicht solche Sachen zu verwenden.

Was ist an QT aufgebläht? Ich hab zwar noch nicht (leider) damit programmiert, aber schon ein bischen die zugehörige Doku (API) gelesen. Kommt mir eigentlich recht logisch vor. Und diese komische GTK/GTK+ Verdrehung? Nicht mein Ding. (obwohl ich da zu wenig zu weiß, liegt aber vielleicht auch an meiner Abneigung gegenüber dem Aussehen von GTK Anwendungen... )

Just my 2 cent.
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Benutzeravatar
jogix
Beiträge: 776
Registriert: 05.10.2002 20:08:16
Wohnort: Lampertheim
Kontaktdaten:

Beitrag von jogix » 06.06.2003 20:08:50

Hi Bert,

ok, ich habe eine Abneigung gegen die KDE Optik... sieht mir zu sehr nach XP aus (zumindest in der Standardeinstellung) Ich bin eigentlich verfechter von Fluxbox, klein und sauschnell, aber da man manchmal die Vorzüge eines komplexeren Desktops braucht, bevorzuge ich Gnome vor KDE, da der zumindest etwas schneller lädt und die Apps nicht ganz so lange brauchen vom Anklicken bis zum offen sein ;)

Aber das ist sicherlich ein Thema, bei dem man einen Flamewar beginnen kann.

BTW, eigentlich hätte ich das Problem auch gleich sehen können....
warum aber an dieser Stelle nicht einfach:

Code: Alles auswählen

char* meldung = "Die Datei\n blabla....";
char* zielname; // ist ja bekannt
int stringlaenge = strlength(meldung) +1 + strlength(zielname) +1; 
labeltext = (labeltext) malloc(stringlaenge * sizeof(char));
sprintf(meldung, zielname);
Ich kann jetzt allerdings nicht nachvollziehen, wo das Problem mit den konstanten Arraygrößen liegt?! Zumindest als C-Programmierer hat man das doch ständig im Hinterkopf - sobald man mit Arrays arbeitet, die als quasi dynamisch gelten, checkt man doch grundsätzlich auf Feldgröße!

Und wenn man damit ein Problem hat, kann man immernoch folgendes Konstrukt verwenden:

Code: Alles auswählen

typedef struct intarraytag {
   int size;
   int[] values;
} intarray

int resize_array (intarray &field, int newsize) {
   /* Code zum resizen, also realloc */
   field->size = newsize;
   return 0;   // wenn's geklappt hat
}
Also, so in etwa,.... ich hab's jetzt nicht getestet und bin mir mit der Referenz nicht mehr ganz sicher, irgendwie komme ich grad nicht mehr von dem blöden Java weg *nerv*

edit: Übergabewert für neue Größe vergessen....
cheers,
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 06.06.2003 23:36:16

Klar. Kann man man machen. Ich behaupte ja auch nicht, daß C schlecht ist. Nur leider sind Programmierer faule Wesen (jedenfalls die, die ich kenne). Und wenn Du Dir mal Code anschaust, wirst Du staunen, wir selten da auf Arraysizes geachtet wird. Es wird halt sicherheitshalber ein großer Bereich ausgefaßt und dann munter drauf los dort hinein geschrieben/kopiert. Und das sind sicherlich keine Ausnahmen, leider. Ich hab mir abgewöhnt, in den Code von bestimmten Kollegen reinzuschauen, und vermeide soweit als möglich auch die Verwendung/Aufrufe des selben. Ich finde da ohne großes Suchen so viele Schwachstellen. Das sind komischweise die selben Leute, die C++ zu umständlich finden / nicht bereit sind etwas Zeit in eine Lernphase zu stecken.

C++ gibt mir da einfache Mittel in die Hand (STL) mit denen ich solche Probleme auch einfach lösen kann.

PS: Als ich das erstemal das Standard-Theme von KDE 3.1 gesehen habe, ist mir auch schlecht geworden, das erinnert nicht an WinXP. Das ist noch schlimmer. Man kann das aber abschalten. Allerdings sollte man da zwischen QT und KDE unterscheiden.. Für solche Untaten kann QT nichts...

PPS: Ich will keinen Flamewar starten. Jeder soll nutzen, was ihm gefällt.
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Antworten