Moin,
also nachdem ich das AVR-Tutorial von Mikrokontroller.net und das
Online-Tutorial von schellong.de gelesen habe, sowie mehrere Stunden mit
meinem Freund Google verbracht habe jetzt folgende Frage:
Kann ich ein struct von einer Funktion retournieren?
So wie ich das überall gefunden habe... ja...!
Allerdings wäre es besser Zeiger zu übergeben etc.
Aber ich möchte ja alle Arten austesten.
Also lege ich ein struct an (in Header und überall inkludiert):
struct {
int a;
int b;
}myStruct;
Dann Funktion in anderer Datei;
myStruct compare(void){
myStruct testStruct;
testStruct.a = 1;
testStruct.b = 2;
return testStruct;
}
In der Main:
myStruct result;
result = compare();
So jetzt kommt der Compiler der mir da sagt;
... incompatible types in assignment
Ich benutze AVR-Studio mit GCC höher 4.
Wo liegt da mein Fehler?
Bitte jetzt keine Antworten das ich das mit Pointer und Co machen soll
oder so in der Richtung. Mir gehts darum das man angeblich die struct
als Objekt direkt retournieren kann. Aber wie?
Bitte korrekte, ordentlich formatierte und vollständige Quelltexte
liefern.
Wenn man die auch noch in [c]... einbettet, bekommt man vielleicht
auch eine vernünftige Antwort.
So wie hier ist das ein Wischiwaschi, das eh nicht stimmen kann;
auf etwas, was eine gewisse Ähnlichkeit mit deinem Programm hat
kann niemand vernünftig antworten.
Ansonsten: ja, man kann eine struct zurückgeben.
nighteagle schrieb:> struct {> int a;> int b;> }myStruct;
Das vereinbart übrigens eine Variable myStruct.
Wenn du einen Typ definieren willst, fehlt ein typedef davor.
Moin,
Da ich die Zeilen direkt hier in das Textfenster getippt habe, um das
Problem zu schildern habe ich keine Formattierung benötigt. Da auch du
das retorunieren von struct bejahst würde mich interessieren wie man
diesen Rückgabewert der Funktion vom Datentyp struct nun sinnig
verarbeitet.
Ob da jetzt int oder uint16_t steht ist von der Sache her doch egal.
nighteagle schrieb:> Da ich die Zeilen direkt hier in das Textfenster getippt habe, um das> Problem zu schildern habe ich keine Formattierung benötigt.
1. Wenn du das nicht zum Schreiben brauchst, mag es dir reichen.
Aber eine halbwegs brauchbare Formatierung ist eine minimale
Höflichkeit gegenüber demjenigen, der das entziffern muß.
2. Daß du hier irgendwas reinklimperst, führt eben dazu, daß man
hier nicht dein Programm zu sehen bekommt, sondern etwas mehr oder
weniger ähnliches.
Was soll das? Lustiges Programmeraten?
Seit der Erfindung von copy&paste kann doch ziemlich jeder Depp
eine 1:1-Kopie liefern, bei der man das echte Programm sieht und
nicht über irgend etwas spekulieren muß, was vielleicht gar nicht
deinem Quelltext entspricht.
Also bitte...
Tja.
Du hast vielleicht keine Einrückung benötigt.
Aber vielleicht fällt Dir ja ein anderer Weg ein uns zu motivieren uns
mit Deinen Problemen auseinanderzusetzen. Falls nicht, bleibt Dir immer
noch, den Ratschlägen bzw. Anforderungen zu folgen.
Glaube ich nicht; aber man sieht ja wieder nur die Hälfte.
Ist mir inzwischen aber auch ziemlich egal.
Wenn man nur Andeutungen vom Programm sieht, dann eine Andeutung der
Antwort:
es sollte gehen.
Schönen Abend.
Moin,
wenn du überfordert bist antworte doch bitte nicht auf meine Fragen.
Deine unnötigen Zurechtweisungen bringen dir nichts und mir auch nichts.
Ich denke das ich in meinen fortgeschrittenen Alter sehr gut einschätzen
kann was ich formatiere und was nicht. Da ich Hilfessuchende in anderen
Foren auch unterstütze ist mir die Handlungsweise bekannt. Und einfache
Fragen mit überflüssigen Randinformationen zu füllen ist eben nicht
sinnig. Es dauert schon ein paar Minuten ordentlich Copy&Paste zu
verwenden. Ausserdem interessiert der Code im gesamten nicht. Es geht
nur um die prinzipielle Vorgehensweise bei der Rückgabe von struct und
nicht um die eingehende Fehleranlayse in meinem Code. Das möchte ich
doch gerne selbst bereinigen.
Um dir das vielleicht mal an einem anderen Beispiel klar zu machen,
worum es den anderen geht:
Wenn dein Auto nicht mehr anspringt, dann baust du ja auch nicht den
Motor aus, bringst den zu einer Werkstatt und sagst, dass dein Auto
nicht anspringt und du meinst es liege am Motor.
Es kommt einfach sehr oft vor, dass der Fehler nicht dort liegt wo man
ihn vermutet. Daher solltest du einfach den kompletten Quellcode
reinstellen.
>Und So vertreibt man Hilfesuchende,
Du tust Dir mit dieser Atitüde keinen Gefallen.
Letzlich willst Du ja von uns Hilfe.
Dann ist es sinnvoll sich nach uns zu richten und
uns nicht Deinen Willen aufzwingen zu wollen.
Du siehst ja was dabei herauskommt.
Im übrigen ist Deine Äusserung, das Du selbst auch anderen Hilfe
leistest hier nicht zielführend, denn man kann daraus nur folgern, dass
Du eben nicht zu dieser Art von Problemen Hilfe leistest. Anderenfalls
könntest Du die Kritik auch nachvollziehen.
Andersherum, wenn eine Hilfe unter Nicht-Beachtung von allein
existierenden Formfehlern möglich wäre, wäre sie auch geleistet worden.
Es mag Dir vielleicht so scheinen, aber es ist nicht wahr, das dies
allein deshalb nicht geschehen ist, weil Formfehler existieren. Vielmehr
ist es so, das an Deinem Quellcode eine ganze Reihe von Mängeln zu sehen
ist, die insgesamt eine Beurteilung der Situation entweder erschweren
oder unmöglich machen.
Überleg Dir das doch bitte nochmal.
Falls Du, aus welchen Gründen auch immer, Deinen kompletten Quellcode
nicht posten willst, ist auch das aktzeptabel. In den entsprechenden
Netiquette-Artikeln im Netz wirst Du auch dazu eine Lösung finden.
SIe besteht darin ein Minimal-Beispiel zu kontruieren, das den selben
Fehler aufweist aber in sich geschlossen ist und sich (abgesehen von der
Fehlermeldung, um die es hier geht) kompilieren lässt.
Moin,
also der Analogie kann ich nicht folgen. Mein Auto ist kaputt, die Lampe
ist defekt. Bringst du dann das Auto in die Werkstatt? Ich würde die
Lampe dem Händler zeigen und eine als Ersatz bekommen. Dies beinhaltet
das ich direkt auf die Lampe schliessen kann, da ich das
Auschlussverfahren angewendet habe.
Meine Funktionen laufen ohne struct retournierung einwandfrei.
ok, dann wende ich mal das Auschlußverfahren an:
Nachdem du hier deine wohl deine exakten Quelltexte gezeigt hast und
nichts unterschlagen hast, daran aber soweit nichts auszusetzen ist,
geht das Zurückgeben von structs offenbar doch nicht in C.
So einfach ist die Welt!
@nighteagle: Hast du C gelernt, oder bringst du dir das selber bei? Ich
vermute mal letzteres. Eine gute Einführung gibt
http://www.asc.tuwien.ac.at/eprog/download/schmaranz.pdf
Jetzt zu deinem Problem (ich hab das mal frei gecoded ohne zu testen,
d.h. typos u.ä. sind durchaus möglich):
1
structxy_pos{
2
uint16_tx;
3
uint16_ty;
4
};
Definiert eine struct mit dem Namen "struct xy_pos".
1
structxy_posshow_touch(){
2
//deklaration einer Variable touch vom Typ struct xy_pos
3
structxy_postouch;
4
5
touch.x=0;
6
touch.y=0;
7
8
returntouch;
9
}
10
11
voidmain(){
12
structxy_postouch;
13
14
touch=show_touch();
15
//touch sollte die werte enthalten
16
}
Ich würde dir aber dringend empfehlen, dich in C einzulesen (z.b. mit
obigem pdf). Übergabe von Strukturen by-value ist problematisch und es
gibt schöneres z.B.:
>Mein Auto ist kaputt, die Lampe>ist defekt. Bringst du dann das Auto in die Werkstatt?
Entschuldige bitte, aber Dein Beispiel ist sinngemäß nicht das selbe wie
das obige.
Das obige Beispiel war: Der Wagen springt nicht an.
Dein Beispiel ist: Das Auto, im Detail die Lampe ist defekt.
Das ist nicht das selbe.
In Deinem Beispiel ist schon eine defekte Einzelkomponente bekannt. Im
obigen aber nicht.
Auch wird in Deinem Beispiel, entgegen Deiner, sagen wir mal "Annahme"
nicht das Ausschlussverfahren verwendet, da Du mitnichten aus einer
Reihe von negativen Aussagen auf die einzig verbleibende aber nicht
verifizierbare positive Aussage kommst.
Ehrlich gesagt habe ich jetzt auch langsam die Nase voll und ich halte
mich hier raus zumal Du ja auf meine Beiträge nicht eingehst.
@voriger post von mir: Rückgabe von structs kann funktionieren, muss
aber nicht - hängt vom compiler ab. Wenn es nicht funktioniert, gibts
Variante 2, die muss immer gehen.
Klaus Wachtler schrieb:> Nein.> Alle Compiler können das.
Ich bilde mir ein gelesen zu haben, dass es nicht gehen muss. Bin mir
aber nicht sicher, ob ISO C das fordert und erinnere mich daran, gelesen
zu haben, dass dem nicht so ist.
Danke Bernhard,
endlich einfache Antworten auf einfache Fragen.
Die zweite Variante kannte ich schon die geht auch, siehe mein Post
Anfangs. Nur die erste nicht, die versuche ich seit ca. 3 Stunden mit
allen möglichen Informationen. Ich habe schon so einige Tutorials wie
Anfangs geschrieben gelesen. Ich glaube auch das mein installierter
Compiler dies nicht kann.
Diese Aussage hättee ich im dritten Post erwartet und das Problem ist
geklärt.
Zu der Auto - Geschichte... ist genau die selbe Argumentation.
Jetzt gebe ich es auf und mache die nächsten Beispiele weiter... Also
ich progge ja in Java und C++ damals mal in c2... nun will ich mich mal
in die AVR begeben :-)
>Ich bilde mir ein gelesen zu haben, dass es nicht gehen muss. Bin mir>aber nicht sicher, ob ISO C das fordert und erinnere mich daran, gelesen>zu haben, dass dem nicht so ist.
Tja. Das mag sein, aber wo hast Du das denn gelesen?
Hier ein Auszug aus der ISO die im Wikipedia Artikel verlinkt ist.
ISO/IEC 9899:TC3 Committee Draft — Septermber 7, 2007 WG14/N1256
6.5.16.1 Simple assignment
Constraints
...
the left operand has a qualified or unqualified version of a structure
or union type
compatible with the type of the right;
...
Nicht klug-schnacken... ausprobieren :-). Nicht immer wird sich an
Normen detailgenau gehalten. Deshalb gibts ja Normen, damit man sich
daran orientiert. Wenn man nie etwas anders machen würde, gäbe es keine
Entwicklung mehr.
Guru schrieb:> Tja. Das mag sein, aber wo hast Du das denn gelesen?
Ist schon ne Weile her - by value übergeb ich structs eigentlich nie...
nighteagle schrieb:> Nicht immer wird sich an> Normen detailgenau gehalten.
Ja, das stimmt - die "Limitations" sind aber üblicherweise in der
Compilerdoku beschrieben. Es ist aber nicht ausgeschlossen, dass ich
auch einen Fehler drinnen habe... wie gesagt... structs by-value...
Auch aus diesen Gründen:
Beitrag "Codesize WinAVR 20060421 vs WinAVR-20090313"
habe ich den WinAVR 20060421 installiert. Dazu gibts viele andere
Diskussionen im Netz, da der neue Compiler auf die 32 Bit Architektur
hin optmiert ist.
Damit geht das zweite Beispiel von Bernhard auch.. eben getestet.
So und oh Wunder... mit dem WinAVR 20090313... das erste Beispiel und
auch mein erster Versuch von vor vier Stunden...
@Guru
Und jetzt könnte ich wieder sagen:
Wo ist der Rest vom minimalen Quellcode? Wie soll man das verstehen???
usw.
Allerdings war ich in der Lage diese einfache Transkation in meinem
Gehirn zu vollziehen.
>Und jetzt könnte ich wieder sagen:>Wo ist der Rest vom minimalen Quellcode? Wie soll man das verstehen???>usw.
Jetzt kann ich gerade nicht folgen. Willst Du damit sagen, das aus
Deiner Sicht in diesem Code
Beitrag "Re: Wieder ein mal struct" etwas fehlt?
@nighteagle bitte beantworte doch folgende Frage noch! Das wäre wirklich
gut zu wissen!
Guru schrieb:> Darf ich das so verstehen, das das erste Beispiel von Bernhard mit der> struct-Zuweisung mit WinAVR 20060421 nicht geht? Ist das richtig?
Moin,
@Guru,
Genau so ist es mit dem Struct by-value mit dem Win AVR 20060241.
@Bernhard
Deine konstruktive Kritik ist in Ordnung und damit stimme ich überein.
Du hast auch erst über das Problem nachgedacht und dann gepostet, wie
man erkennen kann.
@all !Bernhard
Da aber hier so viele Schlaumeier sind die das nicht wussten und statt
es wirklich zu wissen lieber mal ewig über Formatierungen und andere
unnötigen Dinge schrieben, also unfähig waren aus dem von mir
abstrahierten Beispiel einen Sinn zu erkennen möchte ich noch bemerken:
"In vielen Beiträgen die ich hier recherchiert habe, sind immer wieder
die selben Nörgler die auf jede Frage als Erstes mit eine Zurechtweisung
antworten, das noch mit miesen bis gar keinem Ton. Dies sollte man mal
unterbinden. Nicht jeder der hier eine Frage stellt möchte einen riesen
Terz mit Unterdrückung und Prügelleien ausfechten. Dies stellt die
Qualität des Forums dar, darüber sollten die Betroffenden mal
nachdenken. Genau diese werden wohl hierauf antworten, frei dem Motto
"Getroffende Hunde bellen!" Ein Forum lebt nicht von einer Hand
Daueruser sondern von Allen. Wenn die Mentalität aber überwiegend
negativ von den Dauerusern geprägt ist wird das Forum immer mehr die
Themen und damit das Gesamtziel verlieren.
@nighteagle: Ich verstehe die Kritik von den anderen Usern zum Teil. Ich
finde aber, dass ein einmaliger Beitrag reicht und entweder ignoriert
man danach den Thread oder schreibt einen konstruktiven Beitrag (ist
genau gleich aufwändig).
Warum bin ich auch so ein i-tüpfel Reiter?
Ich sitze mind. 8h/Tag vorm Computer und Code/Designe/Dokumentiere.
Meine Augen sind geschult darauf Probleme in ordentlich formatiertem
Code sofort zu erkennen. Ich helfe anderen grundsätzlich gerne, will
mich aber nicht mit deren Formatierung auseinandersetzen (möglicherweise
Alterserscheinung? oder ich hab bereits zuviel gesehen?) d.h. erwarte
ich wohlformatierten Code und ein vollständiges aber minimalisitisches
Beispiel, dass das Problem dokumentiert.
Warum antworte ich trotzdem?
Wenn ich gerade gute Laune habe und/oder mich das Gehabe anderer ärgert
bzw. mich die Frage selber interessiert...
Ich möchte hier noch einen Kritikpunkt anbringen, der mir wesentlich
erscheint. Die wesentliche Information, wie sich nun herausstellt, war
die über die Compilerversion. Das einzige was Du gepostet hattest, war:
>Ich benutze AVR-Studio mit GCC höher 4.
Die Information hätte wesentlich detaillierter sein müssen um die Chance
auf eine direkte Information zu erhöhen.
Ich meine, dass Du die Absichten hier völlig falsch einschätzt. Ich will
das aber hier nicht im einzelnen nochmal vorholen, denn ehrlich gesagt,
habe ich den Eindruck, dass Du vernünftigen Argumenten gegenüber nicht
offen bist.
Ich meine zu erkennen, dass Du von uns erwartest, auf eine ganz
bestimmte und zwar von Dir bestimmte Weise, zu reagieren und bei
Abweichungen davon irrational und, was es so unangenehm macht, auch
fordernd und sogar (mild aber dennoch erkennbar) beleidigend reagierst.
Insgesamt empfinde ich eine Abneigung gegen Deine Verhalten.
nighteagle schrieb:> möchte ich noch bemerken:> "In vielen Beiträgen die ich hier recherchiert habe, sind immer wieder> die selben Nörgler die auf jede Frage als Erstes mit eine Zurechtweisung> antworten, das noch mit miesen bis gar keinem Ton.
Klaus Wachtler gehört in diesem Forum zu den hilfsbereiten Urgesteinen,
die mit ziemlicher Geduld und vor allem fundiertem Fachwissen antworten.
An Engelsgeduld wird er nur noch von meinem Moderatorenkollegen Karl
Heinz überboten.
Wenn Klaus in dem Tonfall auf Deine "Anfrage" reagiert, dann hat das
einen Grund. Du hast in äußerst schlampiger Weise fehlerhaft abgetippten
Pseudocode hingerotzt, und erwartest, daß hilfsbereite den sich
zurechtinterpretieren, um zu erahnen, was Du eigentlich wohl für ein
Problem haben magst.
> Dies sollte man mal unterbinden. Nicht jeder der hier eine Frage stellt möchte> einen riesen Terz mit Unterdrückung und Prügelleien ausfechten.
Das geschieht auch nicht jedem, der hier eine Frage stellt. Sondern nur
Leuten, die nicht in der Lage sind, vernünftige Fragen zu stellen, und
auch auf Nachfragen nicht nachbessern.
Die erste Antwort von Klaus
Klaus Wachtler schrieb:> Bitte korrekte, ordentlich formatierte und vollständige Quelltexte> liefern.> Wenn man die auch noch in [c]... einbettet, bekommt man vielleicht> auch eine vernünftige Antwort.
war ein ausreichend deutlicher und noch nicht sehr unfreundlicher
Hinweis auf das, was Deiner Anfrage fehlte. Da war kein vollständiger
Quelltext, er war unleserlich formatiert und (das ist der
unwesentlichste Punkt) nicht als C-Code gekennzeichnet (das hätte das
Syntax-Highlighting ermöglicht).
Der Sinn von vollständigem Quelltext und ordentlicher Formatierung ist
der, daß der Hilfsbereite in die Lage versetzt wird, Dein Problem
nachzuvollziehen.
Du aber hast Dich hartnäckig geweigert, diese hier *üblichen
Umgangsformen* zu respektieren. Du erwartest eine präzise Antwort,
beschreibst aber das Problem äußerst ungenau. Da Dich hier niemand
kennt, kann auch nicht vermutet werden, ob Dein Problem ein reines
Syntaxproblem ist, ob ein grundlegendes Verständnisproblem vorliegt,
oder ob Du einen obskuren Fehler im Compiler gefunden hast (so
unwahrscheinlich das auch sein mag).
Niemand hier weiß, was Du über die Verwendung von Strukturen weißt, und
daher ist es exorbitant wichtig, daß Du ganz genau deinen Quelltext
postest, und nicht nur eine vage und fehlerhaft abgetippte
Zusammenfassung.
> Dies stellt die Qualität des Forums dar, darüber sollten die Betroffenden mal> nachdenken.
Eben. Die Qualität des Forums besteht unter anderem darin, daß hier
Leute, die sich wirklich damit auskennen, anhand von korrekt geposteten
Sourcecode Fehler in Programmierversuchen anderer Leute erkennen können
und in der Regel recht schnell hilfreiche Hinweise geben.
Durch Verhalten, wie Du es an den Tag legst, demotivierst Du die Leute,
die sich hier hilfsbereit engagieren. Und hier sind Leute unterwegs, die
über eine über alle Zweifel erhabene fachliche Qualifikation verfügen;
Moderatorenkollege Jörg hat beispielsweise aktiv an den Libraries von
avrgcc mitgearbeitet.