WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 20.06.2004, 14:56   #1
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Frage C- Warning Message

Hallo!

Ich habe da ein Programm(in C) für meinen Taschenrechner(TI 200) geschrieben, doch bei einer Funktion gibts jedesmal eine Warning(jedoch keinen Error!!!), obwohl alles perfekt funktioniert.

PHP-Code:
char *stab(double);//oben einmal die Fkt definieren

void _main(void)
{
.
.
.
printf("\n->%s",stab(hm)); //Aufruf der Fkt. in _main()
.
.
.
}

charstab(double hm)  //die Funktion 


    
charerg="Fehler\0"//wenn ich char erg[20] schreib gehts komischerweise garnicht(Compile Error)
    
    
if(hm>0)
        
erg="stabil";
    
    else if(
hm==0)
        
erg="indifferent";
    
    else if(
hm<0)
        
erg="labil";    

 return 
erg;



Warning Message: Initialization discards qualifiers from pointer target type


Also vielleicht kann jemand helfen. Es läuft zwar alles prima, aber gerade deswegen kann ich nicht verstehen dass der Compiler eine Meldung ausspuckt!




Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 20.06.2004, 15:07   #2
Who-T
Elite
 
Registriert seit: 01.08.2000
Beiträge: 1.395


Who-T eine Nachricht über ICQ schicken
Standard

also ich hab das ganze mal über gcc mit -Wall laufen lassen, der sagt mir nix.

ich seh auch auf anhieb keinen fehler.
welche zeile beschwert er sich eigentlich?
____________________________________
Whoever built humanity left in a major design flaw: it was the tendency to bend at the knees.
Who-T ist offline   Mit Zitat antworten
Alt 20.06.2004, 15:44   #3
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard

Jedesmal wenn ich erg="..." schreibe!

PHP-Code:
        charerg="Fehler\0"//hier
    
    
if(hm>0)
        
erg="stabil"//hier
    
    
else if(hm==0)
        
erg="indifferent"//hier
    
    
else if(hm<0)
        
erg="labil"//und hier 

Naja, Hauptsache es läuft.



Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 20.06.2004, 16:33   #4
_m3
Inventar
 
Registriert seit: 24.09.2001
Beiträge: 7.335


Standard

Hmmm, meine C Kentnisse sind ja etwas eingerostet, aber sollte man nicht wo mal Speicher fuer erg reservieren?
Ev. regt er sich auf, dass man dem Pointer einen statischen String zuweist?
____________________________________
Weiterhin zu finden auf http://martin.leyrer.priv.at , http://twitter.com/leyrer , http://www.debattierclub.net/ , http://www.tratschen.at/ und via Instant Messaging auf Jabber: m3 <ät> cargal.org .
_m3 ist offline   Mit Zitat antworten
Alt 20.06.2004, 17:05   #5
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard

Zitat:
Hmmm, meine C Kentnisse sind ja etwas eingerostet, aber sollte man nicht wo mal Speicher fuer erg reservieren?
Ich dachte dass man das nur bei großen Daten machen muss. Bei dem Mini String sollte das also eigentlich nicht nötig sein!

Zitat:
Ev. regt er sich auf, dass man dem Pointer einen statischen String zuweist?
Habs in Turbo C++ durchlaufen lassen, und dort gibts 0 Fehler/0 Warnungen!


Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 20.06.2004, 17:29   #6
Biri
Hero
 
Registriert seit: 04.09.2001
Beiträge: 894


Standard

hi !

@m3_: stimmt, man muss für den string speicher reservieren.

wie groß der sting da ist, ist egal - ein "char" speichert genau 1 zeichen. also z.B. char buffer[20] verwenden

zuweisen kann man einen string (in C) nicht man muss dazu ein stringfunktion verwenden. z.B. strcpy(buffer,"stabil");

weoterer fehler: du vereinbarst in einer funktion einen char - dieser wird am stack angelegt. am ende der funktion gibts du einen zeiger auf eine stack variable zurück !
das führt früher oder später zu fehlern, da der stack nach dem verlassen der Fu. freigegeben wird, die variable also einfach zerstört wird.

Lösung: static verwenden, oder in der main funktion speicher für den string allokieren und die adresse dieses speichers an die aufgerufenen Fu. übergeben -
dort dann (wie auch jetzt) die zuweisung machen.

...ist in C++ oder C# alles einfacher, aber ich denke mal, das gibts am TI 200 nicht.

fg
-hannes
Biri ist offline   Mit Zitat antworten
Alt 20.06.2004, 17:38   #7
_m3
Inventar
 
Registriert seit: 24.09.2001
Beiträge: 7.335


Standard

@biri: Danke fuer die Bestaetigung

Zitat:
Original geschrieben von harry3
Ich dachte dass man das nur bei großen Daten machen muss. Bei dem Mini String sollte das also eigentlich nicht nötig sein!
Denkfehler
Warum sollte das bei kleinen Strings nicht noetig sein?

Zitat:
Habs in Turbo C++ durchlaufen lassen, und dort gibts 0 Fehler/0 Warnungen!
Dann dreh mal den Warning-Level, ANSI-Compliance, etc. auf
____________________________________
Weiterhin zu finden auf http://martin.leyrer.priv.at , http://twitter.com/leyrer , http://www.debattierclub.net/ , http://www.tratschen.at/ und via Instant Messaging auf Jabber: m3 <ät> cargal.org .
_m3 ist offline   Mit Zitat antworten
Alt 20.06.2004, 20:03   #8
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard

OK, danke für die Antworten.
Also das Allokieren hätte ich mir sparen können, das muss anscheinend nicht sein(lt. Compiler).
Wenn man static weglässt, so beschwert sich der Compiler auch nicht. Aber ich schätze mal, dass das static schon wichtig ist!?
Die Fehlermeldungen sind verschwunden, als ich die direkte Zuweisung gegen ein strcpy ausgtauscht habe. Aha, interessant...da ist man ja doch etwas verwöhnt von C++. Wieso hats denn mit direkter Zuweisung trotzdem funktioniert?

Gibts irgendwo eine Seite wo kurz die Eigenarten von C gegenüber C++ erklärt werden? Oder gibts außer bei den Strings eh nicht viel Unterschiede?(die Objektorientierung, Streams etc... jetzt mal weggelassen?)



Viele Grüße,
Harri


PHP-Code:
charstab(double hm)


    
    static 
charerg;
    
erg=(char*)malloc(15);
    
    
strcpy(erg,"Fehler");
    
    if(
hm>0)

        
strcpy(erg,"stabil");
    
    else if(
hm==0)
        
strcpy(erg,"indifferent");
    
    else if(
hm<0)
        
strcpy(erg,"labil");    

 return 
erg;



EDIT: Hab das malloc jetzt wieder weggetan, weil ich dann auch irgendwann free() ausführen müsste, und ich wüsste echt nicht wo ich das tun soll! Im _main() gibts die Variable nicht, und free() vor dem return ausführen wäre auch ein bisschen extrem sinnlos!
harry3 ist offline   Mit Zitat antworten
Alt 20.06.2004, 20:13   #9
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard

Zitat:
Original geschrieben von _m3
@biri: Danke fuer die Bestaetigung

Denkfehler
Warum sollte das bei kleinen Strings nicht noetig sein?

Hallo!

Ich meinte damit, dass man in C++ sich das Allokieren von kleinen Daten sparen kann, weils eh wurscht ist wenn sie unveränderbar groß sind. Denn ob jetzt 1byte nicht verwendet werden kann ist mir relativ wurscht. Bei großen Daten ist das wieder etwas heikler, v.a. am TI200.


Zitat:
...ist in C++ oder C# alles einfacher, aber ich denke mal, das gibts am TI 200 nicht.
Nö, leider
Aber ich bin eh schon froh dass es C fürn TI gibt, früher wurde fürn TI alles mit Assembler geschrieben!!! Da schreibt man mal 1 Seite nur um den String "Hallo Welt" auszugeben!


Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 20.06.2004, 20:41   #10
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard

Das malloc hab ich jetzt komplett weggetan.
Wenn ich static char* erg; schreibe, dann hängt sich der TI auf! (mit der Meldung Protectit memory violation verabschiedet er sich)
Wenn ich aber char erg[15]; schreibe, dann gibts keine Probleme.
Hat da jemand eine Erklärung dafür?


Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:09 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag