Forum: Compiler & IDEs 'sd_raw_write' makes pointer from integer without a cast


von Simon (Gast)


Lesenswert?

Folgender code funktioniert nicht, ich bekomme die Warnung:
(Ulrich Radig, sdcard lib)

../main.c:100:
warning: passing argument 2 of 'sd_raw_write' makes pointer from integer 
without a cast

auch wenn ich (char *) myByte verwende bleibt das Problem.


uint8_t myByte;

sd_raw_write(0,myByte,1);

myByte = 0;

sd_raw_read(0,myByte,1);

puart_putc(myByte);

von Stefan E. (sternst)


Lesenswert?

1
sd_raw_write(0,myByte,1);
->
1
sd_raw_write(0,&myByte,1);

von Simon (Gast)


Lesenswert?

Vielen Dank, funzt bestens.

Wie kann ich ein uint32_t abspeichern?

von Simon (Gast)


Lesenswert?

bin etwas weiter..

ich versuche mir ne put string funktion zu schreiben


void sd_puts(const char *s) {
  while (*s) {
    sd_raw_write(s,&s,1);
    s++;
  }

nur bekomme da zwei warnungen:
../main.c:57: warning: passing argument 1 of 'sd_raw_write' makes 
integer from pointer without a cast

../main.c:57: warning: passing argument 2 of 'sd_raw_write' from 
incompatible pointer type

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Dein Aufruf bzw. die Argumente von sd_raw_write passen nicht zum 
Prototyp von sd_raw_write -- wie immer der auch aussieht.

von Simon (Gast)


Lesenswert?

Ich versuch doch nur ein einfachen uint32 auf die sd karte zu schreiben,
und das beginnend ab position 0.


void sd_put32(uint32_t data) {
  uint8_t ggg = 0;
  char string[11];
  const char s;

  ultoa(data, string, 10);

  while (*s) {
    sd_raw_write(ggg,*s,1);
  ggg++;
  s++;
}


die funktion aus der SD Card lib:

uint8_t sd_raw_write(offset_t offset, const uint8_t* buffer, uintptr_t 
length)

von Simon (Gast)


Lesenswert?

von mir aus kann der auch jedes Bit von dem uint32 auch einzelnd 
schreiben.
Aber platzsparender waere natuerlich die 4-Bytes voll aus zu nutzen.

Ich versuche nun ueber den umweg als string das mit ultoa irgendwie auf 
die sd karte zu bekommen

von gast (Gast)


Lesenswert?

na du hast eine funktion um 8bit zu schreiben ...

und willst 32bit schreiben
warum nicht also die 32bit in 4x 8bit daten verpflücken

(unsigned char*) 32bitdaten  sind die unteren 8bit
senden
(unsigned char*) 32bitdaten>>8  die 32bit um 8 nach rechts schieben
die nächsten 8bit senden
...
...
...
...
bis die  oberen 8bit erreicht sind und weg ...

von Simon (Gast)


Lesenswert?

>warum nicht also die 32bit in 4x 8bit daten verpflücken

genau das versuche ich nun schon nen Tag.
aber wie?

von Stefan E. (sternst)


Lesenswert?

1
uint32_t data;
2
sd_raw_write(0,&data,sizeof(data));

Und deine Funktion oben zum Schreiben eines Strings sieht abenteuerlich 
aus. Da wäre mal etwas C-Lektüre lesen zum Thema Pointer und Strings 
angebracht. C lernt man nicht mal so eben nebenbei durch rumprobieren.

von Simon (Gast)


Lesenswert?

ooooooooooooooooooooooooh mann, das funzt.

../main.c:105: warning: passing argument 2 of 'sd_raw_write' from 
incompatible pointer type


Die warnung bleibt jedoch.

von Stefan E. (sternst)


Lesenswert?

Dann müsste man mal wissen, wie der Prototyp von sd_raw_write genau 
aussieht. Ich bin von void* als zweiten Parameter ausgegangen.

von Mark B. (markbrandis)


Lesenswert?

uint8_t sd_raw_write(offset_t offset, const *uint8_t** buffer, 
uintptr_t length)


Bin ich der Einzige der es blöd findet, dass man Fettdruck hier durch 
Sterne davor und dahinter bekommt? Bzw. in so einem Fall wie oben nicht 
bekommt? [ b ]Fettdruck[ /b ] ist doch besser... (und wieso zum Teufel 
soll das Spam sein?!)

Nun gut, er will also einen Zeiger auf einen Puffer, der 8 Bit hat und 
unsigned ist. Und const. Dann gib ihm doch genau das.

von Werner (Gast)


Lesenswert?

Wenn du das als Code formatierst sollte das nicht passieren
1
uint8_t sd_raw_write(offset_t offset, const *uint8_t** buffer, uintptr_t length)

von Karl H. (kbuchegg)


Lesenswert?

1
uint8_t sd_raw_write(offset_t offset, const uint8_t* buffer, uintptr_t length)

> Nun gut, er will also einen Zeiger auf einen Puffer, der 8 Bit hat und
> unsigned ist. Und const.

Das const spielt hier keine Rolle.
Es ist im Grunde lediglich die Zusicherung der Funktion, dass sie die 
Bytes nicht ändern wird, auf die sie eine Adresse erhält.

> Dann gib ihm doch genau das.

Yep.
1
uint32_t data;
2
sd_raw_write( 0, (uint8_t*)&data, sizeof(data) );

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Was soll denn argument 3 sein? Das müsste doch size_t sein?

Johann

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.