Velikost pointeru – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Velikost pointeru – Mikrokontroléry – Fórum – Programujte.comVelikost pointeru – Mikrokontroléry – Fórum – Programujte.com

 

Pavelv0
Stálý člen
31. 1. 2015   #1
-
0
-

Zdravím, ve své aplikaci potřebuji předat ve funkci hodnotu pointeru. Mám následující kód:

main(void){

u_int8 *addr = 0x1000;

foo(*addr);
}

void foo(u_int8 *adresa){
if(adresa >= (void*)0x1000)
	*adresa++ = nejaka_8_bitova_data;
}


}

Což ovšem nefunguje, momentálně to řeším globální proměnnou, rád bych to ale udělal tak abych si do funkce předal pouze adresu toho pointeru a pak s tím normálně pracoval. Kde mi tam co chybí?

Nahlásit jako SPAM
IP: 109.235.7.–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2015   #2
-
0
-

no mozna by predavani slo trochu lepe, pokud bys ten pointer pri predavani funkci nedereferencoval a nerval tam tedy hodnotu co na tom pointeru je

Mimochodem pak se preda pointer kopii, tudiz ta inkrementace se mimo funkci neprojevi...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pavelv0
Stálý člen
31. 1. 2015   #3
-
0
-

#2 KIIV
takže funkci definovat void foo(u_int8 adresa) a pak volat foo(addr) ?To se mi moc nelíbí.

A potřebuji předávat adresu, ta inkrementace musí být provedena u proměnné v mainu

Nahlásit jako SPAM
IP: 109.235.7.–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2015   #4
-
0
-

#3 Pavelv
kdyz to chces zmenit vne tak zmenis na:  void foo(uint8_t ** ptr) a zavolas  foo(&addr);  (predtim si to mel volat jen s addr, bez dereference - tj bez hvezdicky)

uvnitr funkce to bude veselejsi:    *((*ptr)++) = ....        na srovnani staci  *ptr >= 0x1000   (pripadne suffix U prinejhorsim UL)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pavelv0
Stálý člen
31. 1. 2015   #5
-
0
-

#4 KIIV
Tak to porovnání překladač vzal, ale *((*ptr)++) = ... mi hlásí  #76 operand of "*" must be a pointer. Možná by se slušilo doplnit, že překladač mam nastaven na čisté C.

Nahlásit jako SPAM
IP: 109.235.7.–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2015   #6
-
0
-

   

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

void foo(uint8_t **);

void main(void) {

  uint8_t * addr = malloc(100);

  printf("%p\n",addr);
  foo(&addr);
  printf("%p\n",addr);
}

void foo(uint8_t ** ptr) {
  if(*ptr >= (uint8_t *)0x1000UL) {
    *((*ptr)++) = 0xAA;
  }
}


vysledek:

0x256e010
0x256e011

Pointer v mainu se posunul o jedna... nevypisuju sice co tam je za data, malloc je tam proto, ze na normalnim pocitaci si nemuzu dovolit jen tak zapisovat kde se mi zlibi, narozdil od jednocipu

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pavelv0
Stálý člen
31. 1. 2015   #7
-
0
-

#6 KIIV
Tak se mi to podařilo, ale musel jsem překladači povolit podporu C++ a trochu upravit syntaxi.

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h>

void foo(uint8_t **);

int main(void) {
  uint8_t * addr = (uint8_t *)malloc(100);   
  *addr = 0x11;   
  printf("%p - %p\n",addr,*addr);   
  foo(&addr);   
  *addr--;   
  printf("%p - %p\n",addr,*addr); 
}

void foo(uint8_t ** ptr) {   
  printf("%p - %p\n",*ptr,**ptr);   
  **ptr = 0xFF;   
  *ptr += 1;
}
Nahlásit jako SPAM
IP: 109.235.7.–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2015   #8
-
0
-

proc proboha c++? To slape i s:

gcc -Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition test.c

jediny co to zahlasi je

test.c:7:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]

a to sem tam daval jen proto, ze u jednocipu se stejne nesmis nikdy dostat z mainu.. neni kam vyskakovat... jen se to neco jako zresetuje

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
31. 1. 2015   #9
-
0
-

zato ten tvuj kod toho hlasi vic:

test.c: In function main:
test.c:33:3: warning: format %p expects argument of type void *, but argument 3 has type int [-Wformat]
test.c:35:3: warning: value computed is not used [-Wunused-value]
test.c:36:3: warning: format %p expects argument of type void *, but argument 3 has type int [-Wformat]
test.c: In function foo:
test.c:40:3: warning: format %p expects argument of type void *, but argument 3 has type int [-Wformat]
test.c: In function main:
test.c:37:1: warning: control reaches end of non-void function [-Wreturn-type]

to je vetsinou to, ze %p se pouziva na pointery, a tak hlasi, ze *addr neni pointer, ale hodnota

Ale stale se to v pohode zkompilovalo:

0xce7010 - 0x11
0xce7010 - 0x11
0xce7010 - 0xff

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pavelv0
Stálý člen
31. 1. 2015   #10
-
0
-

#9 KIIV
Ano, to bylo jen z rychlosti, ale prostě dokud v překladači nezapnu C++ extension, tak to hlásí chybu u **addr_flash = 0xFF;

Ale je zajímavé, že dev C++ to přeloží normálně

Nahlásit jako SPAM
IP: 109.235.7.–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2015   #11
-
0
-

#10 Pavelv
jaka skoda, ze to neumi nahlasit neco, co by reklo, co se tomu vlastne nelibi

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Vyznam pointeru — založil Alan

Nastavení pointeru — založil oxidián

Inkrementace pointeru — založil Zelenáč

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý