Zrozumienie działania wskaźników i dynamicznej alokacji pamięci w 89s51 z użyciem C
89s51+RIDE+problem
From: "Grodo" <(zamienXna2000)grodoX_at_nospam_poczta.onet.pl>
Subject: 89s51+RIDE+problem
Date: Wed, 9 Feb 2005 11:04:52 +0100
Hej
Otóż, mam 89s51 i pod port P0 podłaczony bajt diodek (oczywiście odwroteni,
więc sa aktywne zerem). Jak piszę:
#include <reg51.h>
char * tab;
void main()
{
while(1)
{
*tab=0x55;
P0=~(*tab);
}
}
to rzeczywiście lampki zapalają się na przemian. Ale jak pododaję po
gwiazdce:
#include <reg51.h>
char ** tab;
void main()
{
while(1)
{
**tab=0x55;
P0=~(**tab);
}
}
to wszystkie gasną (jak teraz zdejmę nagację w linijce P0=~(**tab); i
będzie P0=(**tab); to się wszystkie zapalają). Dlaczego? Nie powinien być
taki sam efekt jak powyżej?
I pytanie drugie, dlaczego jak dopiszę na początku #include<alloc.h> i po
oczywiście zadeklarowaniu np. char * tab; wpiszę tab =
(char*)malloc(sizeof(char)); to lampki się żarzą? Dlaczego ten dziadowski
malloc nie działa? Próbowąłem już nawet malloc.h ale się nie kompiluje...
Reasumując, dlaczego program z * i z ** nie działa tak samo i dlaczego nie
dziąła malloc? co robię nie tak?
Pozdrawiam
From: "Mister" <wojpie_at_nospam_wywal_to.poczta.onet.pl>
Subject: Re: 89s51+RIDE+problem
Date: Wed, 9 Feb 2005 11:14:51 +0100
I pytanie drugie, dlaczego jak dopiszę na początku #include<alloc.h> i po
oczywiście zadeklarowaniu np. char * tab; wpiszę tab =
(char*)malloc(sizeof(char)); to lampki się żarzą? Dlaczego ten dziadowski
Apropos malloc: robisz odpowiednio inicjalizację pamieci w pliku bodajże
startup.a51?
Mister
From: "Grodo" <(zamienXna2000)grodoX_at_nospam_poczta.onet.pl>
Subject: Re: 89s51+RIDE+problem
Date: Wed, 9 Feb 2005 11:26:33 +0100
Apropos malloc: robisz odpowiednio inicjalizację pamieci w pliku bodajże
startup.a51?
Mister
Zarza, zaraz, pierwsze słyszę o tym pliku. Ale z tego co widzę to
rozszerzenie pliku assemblera a ja piszę w c... Czy czegoś nie wiem? Ale
bardzo chętnie wysłucham ;)
From: Sebastian Bialy <heby_at_nospam_poczta.onet.pl>
Subject: Re: 89s51+RIDE+problem
Date: Wed, 09 Feb 2005 11:31:08 +0100
Grodo wrote:
char * tab;
Na co wskazuje ten niezainijowany wskaźnik ?
> *tab=0x55;
Moim zdaniem w kosmos wciskasz te 0x55 :) Działa pewno przypadkiem.
> char ** tab;
Tu bys musiał mieć podwójne szczęscie ...
--
Sebastian Bialy - heby_at_nospam_poczta.onet.pl
From: "Grodo" <(zamienXna2000)grodoX_at_nospam_poczta.onet.pl>
Subject: Re: 89s51+RIDE+problem
Date: Wed, 9 Feb 2005 12:19:08 +0100
Użytkownik "Sebastian Bialy" <heby_at_nospam_poczta.onet.pl> napisał w wiadomości
news:cucoqg$hn$1_at_nospam_atlantis.news.tpi.pl...
Grodo wrote:
char * tab;
Na co wskazuje ten niezainijowany wskaźnik ?
*tab=0x55;
Moim zdaniem w kosmos wciskasz te 0x55 :) Działa pewno przypadkiem.
char ** tab;
Tu bys musiał mieć podwójne szczęscie ...
--
> Sebastian Bialy - heby_at_nospam_poczta.onet.pl
Nie no, ja wiem o tym, ale co mam zrobić, jeśli mi nie działa malloc i nie
wiem czemu? Pomyslałem, że może jest domyślny ten program, ale nie bardzo.
Badziewie takie.
Przerzucę sie na coś, co ma więcej nóżek... będzie większe
prawdopodobieństwo, że zadziała... ;)
pozdrawiam
P.S. Albo i mniejsze...
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: 89s51+RIDE+problem
Date: Wed, 09 Feb 2005 12:47:28 +0100
On Wed, 9 Feb 2005 12:19:08 +0100, "Grodo"
Użytkownik "Sebastian Bialy" <heby_at_nospam_poczta.onet.pl> napisał w wiadomości
Grodo wrote:
char * tab;
Na co wskazuje ten niezainijowany wskaźnik ?
Nie no, ja wiem o tym, ale co mam zrobić, jeśli mi nie działa malloc i nie
wiem czemu? Pomyslałem, że może jest domyślny ten program, ale nie bardzo.
Badziewie takie.
Przerzucę sie na coś, co ma więcej nóżek... będzie większe
prawdopodobieństwo, że zadziała... ;)
A moze bys jednak przeczytal podrecznik C ?
J.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: 89s51+RIDE+problem
Date: Wed, 09 Feb 2005 12:33:59 +0100
On Wed, 09 Feb 2005 11:31:08 +0100, Sebastian Bialy wrote:
Grodo wrote:
char * tab;
Na co wskazuje ten niezainijowany wskaźnik ?
*tab=0x55;
Moim zdaniem w kosmos wciskasz te 0x55 :) Działa pewno przypadkiem.
Jest pewna szansa ze jako zmienna globalna jest przez C zerowany.
A zero ... to chyba wskazuje na R0 :-)
char ** tab;
Tu bys musiał mieć podwójne szczęscie ...
Generalnie zalecane przeczytanie ksiazki od C :-)
J.