czyszczenie lancucha

0

Poniżej kod czyszczący łańcuch i teraz co to za osrzeżenie które mnie tak denerwuje. Kod działa ale jak usunąć to ostrzerzenie. :-8 :-8 :-8

[Warning] assignment makes integer from pointer without a cast

int main(void)
{
char tekst[1000];

strcat(tekst , "to jest to");
printf("%s\n" , tekst);
Clear(tekst);
printf("%s\n" , tekst);
getch();

return 0;
}

void Clear(char *p)
{
int i;
for(i=0; i<1000; i++){
p[i]=NULL;
}
}

0

strcat(tekst , "to jest to");

Uzywasz strcat, ale skad wiesz, ze tekst jest lancuchem?
A powodem warnninga jest zapewne

p[i]=NULL;
, uzyj p[i] = 0;

0

strcat(tekst , "to jest to");

Uzywasz strcat, ale skad wiesz, ze tekst jest lancuchem?
A powodem warnninga jest zapewne

p[i]=NULL;
, uzyj p[i] = 0;

a widzial to???

char tekst[1000];
0

a po co w ogóle to p[i] skoro p jest wskaźnikiem więc można zrobić ++p zamiast w pętli for umieszczać i++ i indeksować tabelę. Właśnie takie myki są najlepszym mięskiem w c

0

spokojnie zmienilem żeby wszystko było jasne, a to że wskazniki to cały urok w c to fakt

0

strcat(tekst , "to jest to");

Uzywasz strcat, ale skad wiesz, ze tekst jest lancuchem?
A powodem warnninga jest zapewne

p[i]=NULL;
, uzyj p[i] = 0;

a widzial to???

char tekst[1000];

Widocznie widzialem bo napisalem

[...] skad wiesz, ze tekst jest [...]
Definicja

char tekst[1000];

nie daje pewnosci, ze bedzie to lancuch (ze wzgledu na znak o kodzie 0), a uzywana jest funkcja, ktora wymaga lancuchow.</b>

0

dobra trzeba było rzutowanie zrobić pi[i] = (char)NULL i jest gitara

[cya] [cya] [cya]

0

a po co w ogóle to p[i] skoro p jest wskaźnikiem więc można zrobić ++p zamiast w pętli for umieszczać i++ i indeksować tabelę. Właśnie takie myki są najlepszym mięskiem w c

Tez mi myk. :-D Bedzie dzialalo dokladnie tak samo szybko, a bedzie mniej czytelnie. To jest wlasnie przyklad glupiej optymalizacji, ktora tylko wnerwia ludzi czytajacych pozniej taki kod.

0

Niestety akurat w tym wypadku muszę się nie zgodzić, kod ze wskaznikami wykona sie szybciej - zwiazane jest to ze sposobem obliczania pozycji tablicy.Sprawdzalem. :)

int tablica[10], a;
for(a=0; a<10; a++)
tablica[a]= (char)NULL;

int tablica[10], *wsk;
for(wsk=0; wsk<tablica+10; wsk++)
*wsk = (char)NULL;

0

Czy wśród dyskutującyh nad tak ważkim tematem, znalazł się choć jeden, kto zna funkcję memset()/ZeroMemory()/ ...?

I jeszcze jedno po ciezkiego wałka używać (char)NULL? Konwertować 2/4 bajty do chara? Jest taka cyferka jak 0 (ascii 48 dla nie wtajemniczonych). A jeśli już używacie danych 2/4 bajtowych, to proponuję od razu wypelniać własnie po 2/4 bajty. Czy tylko foflik nad tym pomyslał ?

Zamiast strcat() użyj strcpy() nie będziesz musiał zerować ciągu przed jego użyciem, poza tym, wypełnianie tablicy zerami, jeśli używana jest tylko do przechowywania tekstu jest lekkim nonsensem. Wszelkie dane znajdujace się poza pierwszym spotkanym '\0' i tak nie biorą udziału w obróbce.

// optymalizacja zależy od kompilatora i/lub jego ustawień, więc akurat dyskusji na ten temat nie ciągnijcie.

0

Flabra ma calkowita racje. To zalezy od kompilatora.

0

Ok , Flabra masz racje ale konia z rzedem temu kto poda mi przyklad kompilatora ktory wykona jakakolwiek operacje na indeksach szybciej niz na wskaznikach.
Zdarza sie ze operacje na indeksach sa tak samo efektywne jak na wskaznikach ale nigdy indeksy nie sa szybsze od wskaznikow. Uff musialem to napisac

;) ;) ;)

0

gcc 3.2.2: na wskaznikach dziala dokladnie tak samo szybko, ale kod wynikowy jest
nieco wiekszy. Tutaj roznica niewielka i nie ma to znaczenia.

Nie rozumiem tylko jaki jest powod, ze na indeksach mialoby dzialac wolniej?
Stosowanie indeksow daje duzo wieksze pole do popisu dla optymalizatora.
Istnieja przypadki, kiedy na indeksach bedzie dzialalo szybciej - np. jesli
w jednej petli chcesz zmodyfikowac nie jedna, a kilka tablic.
Jak uzywasz wskaznikow, to "wiazesz kompilatorowi rece".
Wskazniki generalnie sa uwazane za zmore przez tworcow optymalizatorow. Po to wprowadzono
do C slowo kluczowe "restrict" (ale malo kto o nim wie).

0

int tablica[10], a;
for(a=0; a<10; a++)
tablica[a]= 0;

int tablica[10], *wsk;
for(wsk=0; wsk<tablica+10; wsk++)
*wsk = 0;

Aby obliczyc indeks kompilator wstawia do programu instrukcje pobierające wartość a i mnozące je przez wielkosc typu int
mozenie to zajmuje czas i miejsce.

w wskaznikach mnozenie wykonywane jest w kroku reguratora petli, wartość jeden jest przeskalowana do wielkosci typu int przed
jej dodaniem do wskaznika. Jednak wystepuje jedna duza roznica te same dwie wartosci (1x4) są mnożone w każdym przebiegu
petli. W wynku tego mnozenie to jest w czasie kompilacji wykonywane tylko jednokrotnie - program zawiera instrukcje dodajace
cztery do wskaznika. W CZASIE dzialania progrmu nie jest wykonywane żadne mnożenie.

Dla przykadu

a=fun(); a=fun();
tab[a]=0; *(tab+a) =0;

wykonanie bedzie identyczne bo w obu przypadkach wymagane bedzie mnozenie potrzebne do przeskalowania wartosci.

warto zdeasemblowac programy i samemu sprawdzic

pozdrawiam

0

Samson - malo wiesz o kompilatorach. Bez optymalizacji rzeczywiscie moze i tak jest. Ale taka petla:

for (int a = 0; i < 10; i++)
  tablica[0] = costam;

zostanie juz przy wlaczeniu najbardziej podstawowych optymalizacji zamieniona np. na cos takiego:

for (int a = 36; a >= 0; a-=4)
   *(int*)(((char*)tablica) + a) = costam;

Oczywiscie mozliwe sa i inne rozwiazania. W kazdym razie zadnego mnozenia nie bedzie.
A nawet jesli, to mnozenie przez 4 wraz z dodawaniem trwa tyle samo co dodawanie - przynajmniej na 386 i wyzej (instr. LEA).

Wypelnialem obiema metodami 4 tablice w jednej petli na raz i metoda z indeksami byla nieznacznie szybsza na gcc 3.2.2, bo wykonywana byla jedna inkrementacja indeksu zamiast 4 wskaznikow. :)

0

Ok Krolik nie mówie że jestem jakimś guru jednak opieram się na faktach zaczerpnietch z literarury. Na polibudzie jest taka ksiązeczka - Wskazniki vademecum profesjonalisty i tam jest przedstawionych sporo algorytmów realizowanych za pomocą wskazników znacznie przyspieszajacych wykonywanie programow. Wskazniki to cała potega jezyka C/C++ , hmmm... nie przekonałes mnie. ;) ;) ;)

0

Z tym sie zgodze - wskazniki to potega i bardzo czesto mozna ich uzyc do przyspieszenia wykonywania kodu i rownoczesnie
tez do zwiekszenia jego przejrzystosci. Wystarczy spojrzec na PHPowcow - oni maja problem... Z drugiej jednak strony nie nalezy wszedzie
wpychac wskaznikow na zasadzie, ze to "zawsze przyspiesza", bo nie zawsze, a na pewno nie
glupia, prosta petle for. Poza tym moze sie przyczynic do bledu. Nie ma sensu
z kodu robic koszmarka zeby go przyspieszyc o te 5%. Komputery sa na tyle szybkie,
ze i tak przez wiekszosc czasu czekaja na zadania.

Taka ciekawostka dot. indeksowania:

int a[20];
5[a] = 0;

Pytanie: co to robi???

0

No i dochodzimy do innego problemu bardzo istotnego - inżynierii oprogramowania. Kod powinien charakteryzować się łatwością konserwacji i przejrzystością. I tu się zgodzę wskaźniki trochę tutaj mącą

Piąty element tablicy zostanie wyzerowany

Poadrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1