einbinden vom c und c++

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich habe auch nie behauptet, dass ein Compiler dies nicht optimieren kann, man darf nur nicht davon ausgehen. Der gcc macht es zum Beispiel nicht:

Code: Alles auswählen

char* text() { 
    char TEXT[] = "Das ist ein Test\n"; 
    return TEXT; 
}

int main(void) { }

Code: Alles auswählen

C:\Dokumente und Einstellungen\Sebastian\Desktop\test>gcc test.c
test.c: In function `text':
test.c:3: warning: function returns address of local variable
Macht der C-Standard zu diesem Sonderfall eventuell irgendwelche Aussagen?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

EyDu hat geschrieben:Ich habe auch nie behauptet, dass ein Compiler dies nicht optimieren kann, man darf nur nicht davon ausgehen. Der gcc macht es zum Beispiel nicht:

Code: Alles auswählen

char* text() { 
    char TEXT[] = "Das ist ein Test\n"; 
    return TEXT; 
}

int main(void) { }

Code: Alles auswählen

C:\Dokumente und Einstellungen\Sebastian\Desktop\test>gcc test.c
test.c: In function `text':
test.c:3: warning: function returns address of local variable
Macht der C-Standard zu diesem Sonderfall eventuell irgendwelche Aussagen?
Das verstehe ich jetzt nicht ganz. Mein Beispiel ist ja mit dem gcc von Mingw kompiliert. Man sieht dabei, dass der String in eine lokale Variable auf den Stack kopiert wird. Dies sollte ja auch so sein. Eine Optimierung liegt m.E. hier nicht unbedingt vor. Dass der String auf dem Stack liegt, führt zu folgenden Problemen:
1. Er kann immer an einer anderen Speicheradresse liegen, was BlackJack bereits sagte.
2. Er kann bei nachfolgenden Funktionsaufrufen evtl. überschrieben werden.
Kann es sein, dass Du es mit

Code: Alles auswählen

char* text() { 
    static char TEXT[] = "Das ist ein Test\n"; 
    return TEXT; 
}
verwechselst?
MfG
HWK
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann sind wir uns doch einig. Mir ging es um den bei dir zweiten Punkt. Ich wollte doch nur zum Ausdruck bringen, dass damit das Ergebnis von "text" zwar einen vernünftigen Pointer liefert, dieser jedoch nicht unbedingt den String "Das ist ein Test\n" repräsentiert, da dieser (String) auf dem Stack liegt und u. U. überschrieben wird.

Oder anders herum: Ich wollte nicht zum Ausdruck bringen, dass der "original" String verändert wird (wie man ja auch gut am ASM-Code sehen kann), sondern dass die Daten auf die der zurückgegebene Pointer zeigt nicht zuverlässlich sind.

EDIT: Oder als Code:

test.c

Code: Alles auswählen

char* spam() {
    char spam[] = "SPAM";
    return spam;
}

char* eggs() {
    char eggs[] = "EGGS";
    return eggs;
}
test.py:

Code: Alles auswählen

import ctypes

dll = ctypes.cdll.LoadLibrary("test.dll")

spam = dll.spam()
eggs = dll.eggs()

print ctypes.c_char_p(spam)
print ctypes.c_char_p(eggs)
Ausgabe:

Code: Alles auswählen

>>> 
c_char_p('EGGS')
c_char_p('EGGS')
>>> 
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Und du bist dir wirklich sicher, dass du deine Programme mit C "optimieren" willst?
es geht mir hier jetzt zur zeit nicht um die optimierung, sondern den einfachen weg mit nur einem string zurückgeben zu erweitern , einen string entgegen zunehmen , erweitern und dann zurückgeben, weil dieses erste stringbeispiel ein bisschen pipifax war.

und die theorie des zufälligen funktionieren zu zerstreuen.
soviel zufall kann nicht sein.

mfg
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

char* spam() {
char spam[] = "SPAM";
return spam;
}

char* eggs() {
char eggs[] = "EGGS";
return eggs;
}
nur mit return, das kann nicht gut gehen.

mfg
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

sechsrad hat geschrieben:und die theorie des zufälligen funktionieren zu zerstreuen.
soviel zufall kann nicht sein.
Naja, das Spassige an C ist ja, dass wenn man in einen nicht vorgesehenen, aber schreibbaren Speicherbereich schreibt, man den Fehler erst bemerkt, wenn andere Programmteile in genau in den gleichen Bereich schreiben. Deswegen ist das zufaellige Funktionieren gerade bei kleineren Programmen nicht so ganz unwahrscheinlich.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

sechsrad hat geschrieben:nur mit return, das kann nicht gut gehen.
Ob man die Adresse nun per return zurückgibt, oder über einen Parameter, macht keinen unterschied.
sechsrad hat geschrieben:es geht mir hier jetzt zur zeit nicht um die optimierung, sondern den einfachen weg mit nur einem string zurückgeben zu erweitern , einen string entgegen zunehmen , erweitern und dann zurückgeben, weil dieses erste stringbeispiel ein bisschen pipifax war.
Dein String-Erweiterungs-Beispiel ist aber ebenso falsch.
sechsrad hat geschrieben:und die theorie des zufälligen funktionieren zu zerstreuen.
soviel zufall kann nicht sein.
Nee, klar. Einfach ganz fest dran glauben ;-)
lunar

EyDu hat geschrieben:Nee, klar. Einfach ganz fest dran glauben ;-)
Ist doch ok... der Glaube versetzt ja bekanntlich Berge, da sollte so ein billiges C-Char-Array ja ein Klacks sein ;)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

EyDu hat geschrieben:Dann sind wir uns doch einig...
Prima!
sechsrad hat geschrieben:...nur mit return, das kann nicht gut gehen.
???
sechsrad hat geschrieben:...soviel zufall kann nicht sein.
Manchmal scheinbar doch.
MfG
HWK
Antworten