www.mikrocontroller.net

Forum: PC-Programmierung Rückgabewert von funktion


Autor: Julietta Ohara (eiskalt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden Code in C geschrieben. Und ich weiß nicht wo mein 
Fehler ist. Wieso ist meine "Ergebnis" nicht wie "erg"? eigenlicht 
sollen die die gleiche Wert haben. Oder täusche ich mich?
______________________________________________________

#include <stdio.h>
#include <stdlib.h>
typedef unsigned char int8;
typedef short int int16;
typedef int int32;

void abc(int32 *data, int32 erg);

int main(){
int32 datain[2];
datain[0] = 0x322e3000;
datain[1] = 0x12345655;
int32 *poiter;
int32 ergebnis;
abc(poiter,ergebnis)
printf("main -- ergebnis:%x\n",ergebnis);

}
void abc(int32 *data, int32 erg){
int16 *ptr1;
int16 *ptr2;
int32 y = *data;
prt1 = (int16*) &y;
ptr2 = (int16*) &erg;
ptr2[1] = ptr1[0];
ptr2[0] = ptr1[1];
printf("void---erg:%x",erg)
}


ERGEBNIS


void---erg:3000322e
main---ergebnis: 8048599
_______________________________________________________



Danke für euere Hilfe

Julietta

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
merkwürdiger Code... und hier kriegt ptr2 die Adresse einer 
Stackvariablen, das geht nicht gut:
ptr2 = (int16*) &erg;

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat dieser Kode einen konkreten Sinn...?

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke das ist eine Hausaufgabe 'schreibe eine Funktion die Hi und Lo 
in einem 32 Bit Wort vertauscht'. Aber das nur Fahrkarten rauskommen 
liegt z.B. noch daran das abc() nicht mal mit initialisierten Werten 
versorgt wird.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem Code ist so ziemlich alles falsch, was man bei
Parameterübergabe nur falsch machen kann.

Lies dir in deinem Textbuch den Abschnitt noch einmal
durch. Langsam, bedächtig und bei jedem Satz überlegen
was dir der Autor sagen will.

Wenn du einen Pointer hast, dann hats du erst mal nur
eine Variable in der eine Speicheradresse gespeichert
werden kann. Damit man mit einer Pointervariablen sinnvoll
arbeiten kann, muss der Pointer erstmal auf gültigen Speicher
zeigen. Sprich er muss erst mal eine Adresse zugewiesen bekommen.

Autor: Julietta Ohara (eiskalt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das Problem ist nur,dasss ich 2 32 bit habe. Und ich muss LSB von 
dem erste 32 bit und MSB von dem zweite 32 bit in eine neue 32 bit 
kriegen. Habt ihr da einen Vorschlag für mich?

Danke für die Antwort
Julietta

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

#define erg(lsb, msb) \
(((uint32)(msb)) & 0xFFFF0000UL) | (((uint32)(lsb)) & 0x0000FFFFUL)


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder als Funktion:

int32 Stitch( int32 first, int32 scnd )
{
  return ( first & 0xFFFF ) | ( scnd & 0xFFFF0000 );
}


zu verwenden als

  int32 a;
  int32 res

  a = ...

  res = Stitch( a, 87234 );

Autor: Julietta Ohara (eiskalt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.