Mame ukol,napsat v C implementaci zjednodušené funkce sprintf dle manuálu,ktery prikladam dole.Je to v anglictine,a vubec tomu nechapu,nemohl by se na to nekdo prosim vas podivat.Vubec tomu nerozumim
Deklarace a popis chování
int Sprintf(char *str, const char *format, ...);
DESCRIPTION
The function produces output according to a format as described below and writes it to the character string str.
The function writes the output under the control of a format string that specifies how subsequent arguments are converted for output.
Return value
Upon successful return, the function return the number of characters printed (not including the trailing ’\0’ used to end output to strings). If an output error is encountered, a negative value is returned.
Format of the format string
The format string is a character string, beginning and ending in its initial shift state, if any. The format string is composed of zero or more directives: ordinary characters (not %), which are copied unchanged to the output stream; and conversion specifications, each of which results in fetching zero or more subsequent arguments. Each conversion specification is introduced by the character %, and ends with a conversion specifier. In between there may be an optional length modifier.
The arguments must correspond properly (after type promotion) with the conversion specifier. By default, the arguments are used in the order given, where each conversion specifier asks for the next argument (and it is an error if insufficiently many arguments are given).
The length modifier
Here, ‘integer conversion’ stands for d, i, o, u, x, or X conversion.
hh
A following integer conversion corresponds to a signed char or unsigned char argument.
h
A following integer conversion corresponds to a short int or unsigned short int argument.
l
(ell) A following integer conversion corresponds to a long int or unsigned long int argument.
The conversion specifier
A character that specifies the type of conversion to be applied. The conversion specifiers and their meanings are:
d,i
The int argument is converted to signed decimal notation.
o,u,x,X
The unsigned int argument is converted to unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal (x and X) notation. The letters abcdef are used for x conversions; the letters ABCDEF are used for X conversions.
c
The int argument is converted to an unsigned char, and the resulting character is written.
s
The const char* argument is expected to be a pointer to an array of character type (pointer to a string). Characters from the array are written up to (but not including) a terminating NUL character.
p
The void * pointer argument is printed in hexadecimal (as if by 0x%x or 0x%lx).
%
A ‘%’ is written. No argument is converted. The complete conversion specification is ‘%%’.
Fórum › C / C++
Nepomohl by mi nekdo
![](img/forum_vlakno_help_vyreseno.png)
ťažka uloha kde to chodiš na školu ? :)
ide o funkciu, ktora prvý parameter (textove pole) naplní nejakým textom, druhý parameter je ten text, ale môže obsahovať aj tzv. format identifiers. popísane ich máš, ďalej je to premenlivý počet parametrov podľa počtu tych identifikátorov. F-cia ma vrátiť počet vypísaných znakov
čomu konkrétnejšie nerozumieš ?
Neni to cele, venku je krasne a ja jsem docela liny takze nevim, jestli se mi bude chtit to dodelavat. Ale aspon na nakopnuti, treba ti to Midin, nebo nekdo jiny dodela nebo uplne prepracuje.
#include <iostream>
#include <streambuf>
#include <cstdarg>
using namespace std;
typedef enum
{ eNone = 0x00,
efShort = 0x02,
efLong = 0x04,
efChar = 0x08,
eInt = 0x10,
eString = 0x20,
eUnsInt = 0x40,
eChar = 0x80,
} eState;
char * GetState(char *pch, int* s)
{ *s = eNone; // vychozi stav
if(*pch == 'l'){ *s = efLong; pch ++;}
if(*pch == 'h'){ *s = efShort; pch++;}
if(*s == efShort && *pch == 'h'){ *s = efChar; pch++;}
switch(*pch)
{
case 'i':
case 'd': *s |= eInt;
pch ++;
break;
case 's': *s |= eString; // mozna tady muze byt jen *s = eString, ale netusim k cemu jsou ty modifikatory hh, h, a l
pch ++;
break;
case 'u': *s |= eUnsInt;
pch ++;
break;
case 'c': *s |= eChar;
pch ++;
break;
};
return pch;
}
int Sprintf(char *str, const char *format, ...)
{ va_list l;
va_start(l, format);
char * pch = (char*)format;
for (;*pch;)
{ if(*pch == '%')
{ int len = 0;
int s;
while(isdigit(*++pch)) len = len * 10 + *pch - '0'; // ziska delku
if(!(pch = GetState(pch, &s))) break;
if(s & eString)
{ char *p1 = va_arg(l,char*), *p2;
for(p2=p1;*p2; ++p2, ++str)
{ if(len && (p2-p1) >= len) break;
*str = *p2;
}
}
else if(s & eChar)
{ *str++ = va_arg(l, int); // zde se nejak musi zakomponovat pouziti hh
}
//else if(s & eInt) atd...
if(s == eNone ) *str++ = *pch++;
}
else
*str++ = *pch++;
}
*str = '\0';
va_end(l);
return pch - format;
}
int main(int argc, char** argv[])
{
char buf[512];
cout << Sprintf(buf, "V buf bude zkacene slovo Pepiku na 2 pismena: %2s\ntake na dalsi radku jeden znak %c\na uplne dole si vytikneme nejaka ta procenta treba 50%%.\n", "Pepiku", 'z') << endl;
cout << buf << endl;
cin.get();
return 0;
}
polopaticky:
mephi si myslel ze v *.h nebo *.lib (*.a) najde zdrojak toho co potrebujete a ten byste si zkopiroval, v *.h to logicky neni
Vam vsak radim nereste blbosti a koukejte si to dodelat, jako na jednu stranu s ukolama pomahaj radi vsichni ale vy vyslovne to chcete po nekom cely dodelat! Na druhou stranu bude jedine dobre, kdyz bude mit CR mene "odborniku" v IT
To jecmenk:
Nemam moc casu, takze jsem to tak naplacal. Ovsem ma to docela podstanou chybu - neresi zaporna cisla(je potreba upravit funkci pro prevod).
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
typedef enum
{ eNone = 0x00,
efShort = 0x02,
efLong = 0x04,
efChar = 0x08,
eInt = 0x10,
eString = 0x20,
eUnsInt = 0x40,
eChar = 0x80,
eOctal = 0x200,
eHexa = 0x400,
eBigHexa = 0x800,
ePointer = 0x1000
}eStates;
char * GetState(char *pch, int* s)
{ *s = eNone; // vychozi stav
if(*pch == 'l'){ *s = efLong; pch ++;}
if(*pch == 'h'){ *s = efShort; pch++;}
if(*s == efShort && *pch == 'h'){ *s = efChar; pch++;}
switch(*pch)
{
case 'i':
case 'd': *s |= eInt;
pch ++;
break;
case 's': *s = eString;
pch ++;
break;
case 'u': *s |= eUnsInt;
pch ++;
break;
case 'c': *s |= eChar;
pch ++;
break;
case 'o': *s |= eOctal;
pch++;
break;
case 'x': *s |= eHexa;
pch++;
break;
case 'X': *s |= eBigHexa;
pch++;
break;
case 'p': *s = ePointer;
pch++;
break;
};
return pch;
}
void Change(char *out, long num, int base, int up)// neresi zaporna cisla
{ if(base <2 || base > 32) return;
char buf[128];
int i, t;
for(i=0; num;num /= base)
{ t = num % base;
if(t > 9) { t = t%10; buf[i++] = (up)?'A'+t:'a'+t;}
else buf[i++] = t + '0';
}
for(;i > 0;) *out++ = buf[--i];
*out = '\0';
}
int Sprintf(char *str, const char *format, ...)
{ va_list l;
va_start(l, format);
char * pch = (char*)format;
char* start = str;
int i;
for (;*pch;)
{ if(*pch == '%')
{ int len = 0;
int s;
while(isdigit(*++pch)) len = len * 10 + *pch - '0';
if(!(pch = GetState(pch, &s))) break;
if(s == eString)
{ char *p1 = va_arg(l,char*), *p2;
for(p2=p1;*p2; ++p2, ++str)
{ if(len && (p2-p1) >= len) break;
*str = *p2;
}
}
else if(s == ePointer)
{ *str++ ='0';*str++ = 'x';
void *p = va_arg(l, void*);
char temp[128];
Change(temp,(long)p,16, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s & eChar)
{ if(s & efChar) *str++ = (unsigned char)va_arg(l, int);//??
else *str++ = (char)va_arg(l, int);
}
else if(s & eInt)
{ long num = va_arg(l, long);
if(s & efShort) num = (short int)num; // oreze rozsah
if(!(s & efLong)) num = (int)num;
char temp[128];
Change(temp, num, 10, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s & eUnsInt)
{ unsigned long num = va_arg(l, unsigned long);//??
if(s & efShort) num = (unsigned short)num;
if(s & efLong) num =(unsigned int)num;
char temp[128];
Change(temp, num, 10, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s & eOctal)
{ long num = va_arg(l, long);
if(s & efShort) num = (short)num;
if(!(s & efLong)) num = (int)num;
char temp[128];
Change(temp, num, 8, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s & eHexa || s & eBigHexa)
{ long num = va_arg(l, long);
if(s & efShort) num = (short)num;
if(!(s & efLong)) num = (int)num;
char temp[128];
Change(temp, num, 16, s & eBigHexa);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s == eNone) *str++ = *pch++;
}
else
*str++ = *pch++;
}
*str = '\0';
va_end(l);
return str - start;
}
int main()
{ char buf[512];
int len = Sprintf(buf, "%d+%i=%ld", 1, 4, 1+4);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "20%% ze 100 je %d", 100/5);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v osmickove soustave je %o", 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Znak %c nebo %hhc.", 165, 165);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Adresa buf je %p.", buf);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1. dva znaky ze slova %s jsou %2s\n", "Pepiku", "Pepiku");
printf("%sVytisknuto %d znaku.\n", buf, len);
return 0;
}
To Jura:a to se dela prosimte jak.Jinak sem to poustel v dev c,a pise mi to ze
`va_list' undeclared (first use this function)
`va_start' undeclared (first use this function)
`isdigit' undeclared (first use this function)
`va_arg' undeclared (first use this function)
`va_end' undeclared (first use this function)
kdyz to pise ze to neni deklarovani tak se to musi nejak deklarovat nejakou funcki ne.
To jecmenk:
Musis tam pridat potrebne hlavickove soubory. Pokud jsi vzal cely ten zdrojovy kod, tak se docela divim, ze nezna ty deklarace. Kazdopadne isdigit najdes v ctype.h a va_** v hl. souboru stdarg.h. Nad upravou fce Change se mi momentalne nechce uvazovat, ale zkus nad tim trochu popremyslet mozna te neco napadne.
To Jura:Tak uz sem to upravil v dev c,se to uz prelozi i spusti.Ted uz jen udelat toto
neresi zaporna cisla(je potreba upravit funkci pro prevod.
zkousel sem nad tim ppremyslet ale nic me nenapadlo,pomuzes mi ten program doklepnout do konce,diky moc
tak tohle je vazne presprilis, myslim ze prilis zkousite jeho treplivost! to je preci tak neslusny chtit to po nem cely dodelat, kdybyste aspon vzal to co mate a odtahnul na jiny forum a doskemrat to tam, ale tohle ? !!! dit on tomu venoval hodiny, mozna i desitku a vy po (22-13)hodinach rikate takovou blbost ze jste premyslel a nic vas nenapadlo, kdyz na programovani nemam nelezu tam ! stejne jako ja nemam na matiku tak nepolezu na matfyz
v tomhle smeru je lepsi ze ma CR mene IT "odborniku"
sorry musel sem to rict za Juru protoze ma urcite dobry srdce a sam by to nerekl ;-)
To zacatecnik:Ja za to prece nemuzu ze tomu nechapu i presto ze se na to podivam,nemam na to bunky.Vsak ja na programatora nejsem,jsem na jinym oboru,pres pocitace,mam jen tohle programu v prvnim roku,je to jen okrajove,sem si to musel vzit,nic jinyho tam na vyber nebylo,kdybych si mohl vybrat tak si to nevemu,me jde hlavne matika a tak ,tohle proste ne
To myth:
Popravde receno sam ani moc nevim, zase tak slozita ta uloha neni(projit text a zajimava mista nahradit). Ale vice, jak 2-3 hodiny bych tomu nevenoval. Nepsal sem to najednou, vzdy po nejakych chvilich(30 min.) - podle toho ten kod taky tak vypada:-).
To jecmenk:
Sorry, ale jak uz jsem psal vyse, casu nemam nazbyt. Za nedlouho mam maturu a nikdo se na me na zkousky nenauci...
To jecmenk:
Mno, mel bych se naucit cist. Myslim, ze ted uz je to kompletni, ale prop jistotu to jeste over.
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
enum
{ eNone = 0x00,
efShort = 0x02,
efLong = 0x04,
efChar = 0x08,
eInt = 0x10,
eString = 0x20,
efUnsDec = 0x40,
eChar = 0x80,
eOctal = 0x200,
eHexa = 0x400,
eBigHexa = 0x800,
ePointer = 0x1000
};
char * GetState(char *pch, int* s)
{ *s = eNone; // vychozi stav
if(*pch == 'l'){ *s = efLong; pch ++;}
if(*pch == 'h'){ *s = efShort; pch++;}
if(*s == efShort && *pch == 'h'){ *s = efChar; pch++;}
switch(*pch)
{
case 'i':
case 'd': *s |= eInt;
pch ++;
break;
case 's': *s = eString;
pch ++;
break;
case 'u': *s |= efUnsDec;
pch ++;
break;
case 'c': *s = eChar;
pch ++;
break;
case 'o': *s |= eOctal;
pch++;
break;
case 'x': *s |= eHexa;
pch++;
break;
case 'X': *s |= eBigHexa;
pch++;
break;
case 'p': *s = ePointer;
pch++;
break;
};
return pch;
}
void Change(char *out,unsigned long num, int base, int up)
{ if(base <2 || base > 32) return;
char buf[128];
int i, t;
for(i=0; num > 0;num /= base, ++i)
{ t = num % base;
if(t > 9) { t %= 10; buf[i] = (up)?'A'+t:'a'+t;}
else buf[i] = t + '0';
}
for(;i > 0;) *out++ = buf[--i];
*out = '\0';
}
int Sprintf(char *str, const char *format, ...)
{ va_list l;
va_start(l, format);
char * pch = (char*)format;
char* start = str;
char temp[128];
int i;
for (;*pch;)
{ if(*pch == '%')
{ int len = 0;
int s;
while(isdigit(*++pch)) len = len * 10 + *pch - '0';
if(!(pch = GetState(pch, &s))) break;
if(s == eNone) *str++ = *pch++;
else if(s == eString)
{ char *p1 = va_arg(l,char*), *p2;
for(p2=p1;*p2; ++p2, ++str)
{ if(len && (p2-p1) >= len) break;
*str = *p2;
}
}
else if(s == ePointer)//The void * pointer argument is printed in hexadecimal (as if by 0x%x or 0x%lx).
{ *str++ ='0';*str++ = 'x';
void *p = va_arg(l, void*);
Change(temp,(long)p,16, 0);
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
else if(s == eChar) // The int argument is converted to an unsigned char, and the resulting character is written.
{ *str++ = (unsigned char)va_arg(l, int);
}
else {
long num = va_arg(l, long);
if(s & efShort) num = (s & efUnsDec)?(unsigned short)num:(short)num;
else if(s & efChar) num = (s & efUnsDec)?(unsigned char)num:(char)num;
if((s & eInt)) //The int argument is converted to signed decimal notation.
{ num = (int)num;
Change(temp, abs(num), 10, 0);
if(num < 0) *str++ = '-';
}
else if(s & eOctal)
{ num = (unsigned int)num;
Change(temp, num, 8, 0);
}
else if((s & eHexa)||(s & eBigHexa))
{ num = (unsigned int)num;
Change(temp, num, 16, s & eBigHexa);
}
else
{ Change(temp, (s & efUnsDec)?num:abs(num), 10, 0);
if(num < 0 && !(s & efUnsDec)) *str++ = '-';
}
for(i=0;i < strlen(temp); ++i) *str++ = temp[i];
}
}
else
*str++ = *pch++;
}
*str = '\0';
va_end(l);
return str - start;
}
int main(int argc, char** argv[])
{ char buf[512];
int len = Sprintf(buf, "%d-%i=%d", -1, 4, -1-4);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "20%% ze 100 je %d", 100/5);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "-1000 v osmickove soustave je %o", -1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Znak %c nebo %hhc.", 165, 165);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Adresa buf je %p.", buf);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1. dva znaky ze slova %s jsou %2s\n", "Pepiku", "Pepiku");
printf("%sVytisknuto %d znaku.\n", buf, len);
getchar();
return 0;
}
Diky moc,za ten program,v dev se mi to rozjelo v pohode,bez problemu,doplnil sem jeste hlavicky jak minule a funguje to,Ale ted jsem zjistil ze krom knihoven stdlib.h,stdio.h,string.h muze byt jen povoleny stdarg.h,takze ctype.h tam nemuzu dat,kdyz to napisu.Dale nam jeste rikal taky brzo ze to ma byt reseno portabilním způsobem coz nevim co znamena a dle standardu jazyka C.
Jánevím, ale když něco neumím, nenechám si to dělat od nikoho jinýho. Jen si nechat poradit funkci, parametry si najdu na netu. Takhle dostaneš jedničku a co z toho. Až budete mít tohle v testu, budeš v prdeli. Lepší je mít trojku a tvůj učitel bude vědět, že líp to nezvládneš, než dostat jedničku a pak tvího profesora nasrat. Tož můj dojem
To jecmenk:
ctype.h je tam jen kvuli fce isdigit ->
#include <ctype.h> nahrad zapisem:
int isdigit(int c) {return c >='0' && c <='9';}
Portabilita : musi byt zajisteno, ze program lze snadno prenest na jine platformy(Win, *unix a spousta dalsich podminek), tzn. pokusit se co nejvice pouzivat fce, typy, atd.. definovane standardem jazyka C. Tohle se snazim dodrzet vzdy(pokud to jde), takze zde by problem byt nemusel. Kazdopadne, pokud mas moznost program zkompilovat treba na Linuxu, tak to udelej a over funkcnost kodu.
To survik1:
Ackoliv se to muze zdat zvlastni s tvym nazorem, jako autor kodu, souhlasim. Pokud se ptas proc jsem to napsal za nej, tak na to existuje jedina odpoved: problem me zaujal. Samozrejme muzes tvrdit, ze jsem si to mel nechat pro sebe. Ale druha stranka veci je ta, ze to nekdo muze pouzit jako inspiraci(od toho tu fora jsou). Dale take netvrdim, ze je to napsano dobre(profik by urcite vymyslel neco mnohem lepsiho). Nicmene tohle vsechno, jak jsi napsal sam, stejne jecmenkovi nepomuze pokud si jej ucitel proklepne...
Aha tak to jo,ja myslel ze to znamena,ze to ma byt nejak jinak napsany.Sem to ukazoval jednymu ucitelovi,tem n mi rikal ze postup je dobrej,ale ze se tam pouziva dost prvku C++,melo by to byt proste jen v C.Tak ja nevim,najit si nekde na internetu treba cim to zamenit,co je prvek C++ a nejak to udelat aby to vse bylo v C.
To jecmenk:
Prvku z C++? Ani jedna radka kodu neni napsana v C++, cele jsem to psal v cistem C. Mozna se mu akorat nelibi ty inline kometare,tak je nahrad klasickymi cekovskymi komentari. Nicmene norma C99 myslim dovoluje psat inline komentare komentare.
6.4.9 Comments
1 Except within a character constant, a string literal, or a comment, the characters /*
introduce a comment. The contents of such a comment are examined only to identify
multibyte characters and to find the characters */ that terminate it.69)
2 Except within a character constant, a string literal, or a comment, the characters //
introduce a comment that includes all multibyte characters up to, but not including, the
next new-line character. The contents of such a comment are examined only to identify
multibyte characters and to find the terminating new-line character.
3 EXAMPLE
"a//b" // four-character string literal
#include "//e" // undefined behavior
// */ // comment, not syntax error
f = g/**//h; // equivalent tof = g / h;
//\
i(); // part of a two-line comment
/\
/ j(); // part of a two-line comment
#define glue(x,y) x##y
glue(/,/) k(); // syntax error, not comment
/*//*/ l(); // equivalent to l();
m = n//**/o
+ p; // equivalent tom = n + p;
69)Thus, /* ... */ comments do not nest.
Teda tenhle topic sleduju uz od minulýho tejdne a docela zajímavý :) ... Jura sis s tim dal práci koukám, docela dobrej kousek kódu. Tak tě nebudu už zatěžovat zbytečnejma otázkama, jen se chci zeptat wo co go ... Myslím podstatu zadání. "Zjednodušená implementace funkce sprintf" je na co ? To je jako napsání jiné funkce, která dělá přesně to samý jako sprintf ?
vollf82 píše:
To je jako napsání jiné funkce, která dělá přesně to samý jako sprintf ?
Jj, tak nejak, ale o mnohem horsi.
"Zjednodušená implementace funkce sprintf" je na co ?
Za normalnich okolnosti je zkratka....na hovno. Ale vzhledem k tomu, ze je to domaci ukol, tak se tomu ani tak moc nedivim(existui i horsi zadani).
Jura:ahoj mi mame taky stejnej priklad do skoly,pouzil jsem tvuj kod.Posilam to pres automat,kde se odesila jen vlastni funkce bez includ a int main,v tom automate u ucitela se to k ty vlastni funkci samo doplni ten zbytek.Kdyz to tam poslu tak to pise ze to nelze prelozit a vypise se to s timhle protokolem o chybach :
Protokol
auto_check
test.c: In function 'GetState':
test.c:23: error: syntax error before '/' token
cc1: warnings being treated as errors
test.c:24: warning: control reaches end of non-void function
test.c: At top level:
test.c:25: error: syntax error before 'if'
test.c:54: warning: ISO C does not allow extra ';' outside of a function
test.c: In function 'Change':
test.c:60: warning: ISO C90 forbids mixed declarations and code
test.c: In function 'Sprintf':
test.c:75: warning: ISO C90 forbids mixed declarations and code
test.c:83: warning: implicit declaration of function 'isdigit'
test.c:93: error: syntax error before '/' token
test.c:93:98: error: invalid suffix "x" on integer constant
test.c:93:106: error: invalid suffix "x" on integer constant
test.c:95: warning: ISO C90 forbids mixed declarations and code
test.c:97: warning: implicit declaration of function 'strlen'
test.c:97: warning: incompatible implicit declaration of built-in function 'strlen'
test.c:99: error: 's' undeclared (first use in this function)
test.c:99: error: (Each undeclared identifier is reported only once
test.c:99: error: for each function it appears in.)
test.c:99: error: syntax error before '/' token
test.c:105: error: 'num' undeclared (first use in this function)
test.c:108: error: syntax error before '/' token
test.c:110: warning: implicit declaration of function 'abs'
test.c:76: warning: unused variable 'start'
test.c:113: warning: control reaches end of non-void function
test.c: At top level:
test.c:114: error: syntax error before 'else'
test.c:116: error: syntax error before numeric constant
test.c:116: warning: type defaults to 'int' in declaration of 'Change'
test.c:116: error: conflicting types for 'Change'
test.c:59: error: previous definition of 'Change' was here
test.c:116: warning: data definition has no type or storage class
test.c:121: error: syntax error before numeric constant
test.c:121: warning: type defaults to 'int' in declaration of 'Change'
test.c:121: error: conflicting types for 'Change'
test.c:59: error: previous definition of 'Change' was here
test.c:121: warning: data definition has no type or storage class
test.c:136: warning: type defaults to 'int' in declaration of 'str'
test.c:136: warning: data definition has no type or storage class
test.c:137: warning: type defaults to 'int' in declaration of '__builtin_va_end' test.c:137: warning: parameter names (without types) in function declaration test.c:137: warning: conflicting types for built-in function '__builtin_va_end' test.c:137: warning: data definition has no type or storage class test.c:138: error: syntax error before 'return' test.c:142: warning: second argument of 'main' should be 'char **' test.c: In function 'main': test.c:144: warning: implicit declaration of function 'printf' test.c:144: warning: incompatible implicit declaration of built-in function 'printf' test.c:159: warning: implicit declaration of function 'getchar' test.c:160: warning: implicit declaration of function 'system' test.c: At top level: test.c:188: warning: second argument of 'main' should be 'char **' test.c:188: error: redefinition of 'main' test.c:142: error: previous definition of 'main' was here test.c: In function 'main': test.c:188: error: number of arguments doesn't match prototype test.c:142: error: prototype declaration --- gcc-4.0 --- ! Chyba test.c: In function `GetState': test.c:23: parse error before `/' cc1: warnings being treated as errors test.c:24: warning: control reaches end of non-void function test.c: At top level: test.c:25: parse error before `if' test.c:54: warning: ANSI C does not allow extra `;' outside of a function test.c: In function `Change': test.c:60: parse error before `char' test.c:62: `i' undeclared (first use in this function) test.c:62: (Each undeclared identifier is reported only once test.c:62: for each function it appears in.) test.c:63: `t' undeclared (first use in this function) test.c:64: `buf' undeclared (first use in this function) test.c:62: warning: value computed is not used test.c: In function `Sprintf': test.c:75: parse error before `char' test.c:79: `pch' undeclared (first use in this function) test.c:83: warning: implicit declaration of function `isdigit' test.c:93: parse error before `/' test.c:93: numeric constant with no digits test.c:93: numeric constant with no digits test.c:95: parse error before `void' test.c:96: `temp' undeclared (first use in this function) test.c:96: `p' undeclared (first use in this function) test.c:97: `i' undeclared (first use in this function) test.c:99: `s' undeclared (first use in this function) test.c:99: parse error before `/' test.c:105: `num' undeclared (first use in this function) test.c:108: parse error before `/' test.c:113: warning: control reaches end of non-void function test.c: At top level: test.c:114: parse error before `else' test.c:116: parse error before `8' test.c:116: warning: type defaults to `int' in declaration of `Change' test.c:116: conflicting types for `Change' test.c:59: previous declaration of `Change' test.c:116: ANSI C forbids data definition with no type or storage class test.c:121: parse error before `16' test.c:121: warning: type defaults to `int' in declaration of `Change' test.c:121: ANSI C forbids data definition with no type or storage class test.c:136: warning: type defaults to `int' in declaration of `str' test.c:136: ANSI C forbids data definition with no type or storage class test.c:137: parse error before `void' test.c:142: warning: second argument of `main' should be `char **' test.c: In function `main': test.c:144: warning: implicit declaration of function `printf' test.c:159: warning: implicit declaration of function `getchar' test.c:160: warning: implicit declaration of function `system' In file included from test.c:167: /usr/include/stdio.h: At top level: /usr/include/stdio.h:327: warning: type mismatch with previous implicit declaration test.c:144: warning: previous implicit declaration of `printf' test.c:188: warning: second argument of `main' should be `char **' test.c:188: redefinition of `main' test.c:142: `main' previously defined here test.c: In function `main': test.c:188: number of arguments doesn't match prototype test.c:142: prototype declaration --- gcc-2.95 --- ! Chyba
Nevis co s tim,bo popride jak to upravit
To tomas:
Vzhledem k tomu, že o tom automatu v podstatě nic nevím, tak se mi těžko bude radit. Sice jsem už o tomhle automatu v jiných diskuzích něco četl a je docela možné, že potřebuje všechno mit deklarované lokálně - čili žádné pomocné fce(nevím to jasně, v zadání to blíže specifikováno nebylo). Jediné co mě z toho výpisu chyb napadá: zkus smazat veškeré komentáře, dále veškeré _deklarace_ proměnných dej před cyklus for(;*pch;) a doplň fci isdigit(příklad je o pár postů výše). A v případě, že máš v zadání zakázáno používat další pomocné fce, tak si to předělej sám do jedné, obrovské a nepřehledné funkce.
To Jura_:Mas pravdu tak nejak to pracuje,zda se me ze ucitel rikal ze to ma byt lokalne.Komentare sem smazal, fci isdigit sem taky doplnil akorat nechapu jak myslis-dále veškeré _deklarace_ proměnných dej před cyklus for(;*pch;) a pak-všechno mit deklarované lokálně - čili žádné pomocné fce .Zadani mam stejny v tom problem nevidim.
To tomas:
Jak jsem už jednou napsal - pokud učitel vyžaduje použití jen lokálních deklarací, budeš muset předělat veškeré pomocné datové typy(enum) a funkce, tak aby byly součástí funkce Sprintf. A protože C není Pascal, vznikne ti z toho jedna obrovská a nepehledná funkce. Takovou prasečinu dělat nebudu. A tim veškeré _deklarace_ proměnných dej před cyklus for(;*pch;) jsem myslel presunutí deklarcí(int len; int s; long num...), které se necházejí v těle cyklu, před ten cyklus. Toť vše.
Už mě to přestává bavit, takže s tímto topicem končím.
To tomas:
Pokud jsi už něco naprogramoval, tak by neměl být problém nahradit volání funkcí jejich kódem. Když si budeš říkat, že to neuděláš, tak ti zaručeně nepůjde a daleko takhle nedojdeš. Takže zkus bojovat a uvidíš, že se to poddá - stačí trochu popřemýšlet nad tím kódem.
To Jura:ahojky tak sem ten program z builderu co si mi poslal vyladila tak ze mi to hazi jen chybu u radku
{ n = (s & efUnsDec)?num:abs(num);
pry ze je to vnorena funkce a ta se musi rozepsat nevis jak na to prosimte a pak jeste jedna a to
'NULL' undeclared (first use in this function)
uz mi na to psal Maaartin neco,ale tak to podle me nema byt
NULL nahradte 0, tot vse. Nebo jestli muzete pouzit makra tak piste pod hlavickove soubory:
#define NULL 0
ohledne
n = (s & efUnsDec)?num:abs(num);
by melo stacit (pisu z hlavy nevyzkouseno)
if(s & efUnsDec)
n = num;
else
n = abs(num);
ad builder: nic si z toho nedelejte, holt tamni kapacity trosku vypenili i ja sem cumel co ze to tam pisou, normalne se takhle nechovaj, tak ne ze na ten server zanevrete ;-)
zatial
to zacatecnik:Ahojky dekuju ti,stacilo jen dat tam nulu a uz to automatem proslo,ale jak si mi napsal,to rozepsani toho abs tak to nepomohlo porad to vypisuje 104: warning: implicit declaration of function 'abs'
To vis ze ne,me to taky prekvapilo,no asi se jim nelibilo,jak su blba a porad se vyptavam a zahlcuju forum svymi prispevky
pokud tomu dobre rozumim je treba prepsat makro abs protoze nemuze byt volano (je v math.h tusim a to neni povoleno)
tak sem se zamyslel a napadlo me tohle:
#include <stdio.h>
//#include <math.h>
int main (void)
{
int cislo = -850;
printf("cislo=%d\n", cislo);
if(cislo<0)
cislo-=2*cislo;
printf("cislo=%d\n", cislo);
return 0;
};
takze onen Vas kod by mozna prosel uz takhle:
if(s & efUnsDec)
n = num;
else{
if(num < 0)
num-=2*num;
n = num;
}
nebo mozna takto:
if(!(s & efUnsDec))
if(num < 0)
num-=2*num;
n = num;
jeste ad builder: neni to otravovani hlouposti- ucenej z nebe nespad, kolikrat uz sem videl tyhle dva mistry odpovidat stokrat na ten samej zacatecnickej dotaz a nikdy nic nerekli, zavidel sem jim jejich trpelivost to ja bych uz rval a co hledani ?? !!
mno a ted tohle...proste rupli nervy :)
zatial
To zacatecnik:
cislo-=2*cislo;
Nějak jsem nepobral to násobení dvěma. K čemu to je dobré?
Když už to chces násobit, tak snad -1,aby jsi nezměnil hodnotu čísla.
Nicméně vůbec nemusíš používat násobení, stačí použí operátor minus.
n = (s & efUnsDec)?num : ( num < 0) ? - num : num;
to Jura:
mno mas tam ukazku kde ten vzorec pouzivam a i pri zamysleni je bezchybny
i kdyz to minuslze taky pouzit, ale zapis:
n = (s & efUnsDec)?num : ( num < 0) ? - num : num;
?: je neprijatelny kvuli onomu automatu.
moc nechapu co ty nechapes, nenasobi se to -2 ale odecita se dvojnasobna hodnota cisla
cili cislo = -850
cislo -=2*cislo;
lze prepsat:
cislo = cislo - (2*cislo);
takze
-850 = (-850) - (2*-850)
-- udela plus a my dostavame +850
Kua, asi už na ten monitor nevidím. Sorry, já tam celou dobu viděl -2, už mám dost. Jinak by mě docela zajímalo, kda jsi zjistil, že nefunguje ternární operátor?
Tedy v případě, že prošlo:
if(s & efShort) num = (s & efUnsDec)?(unsigned short)num:(short)num;
//atd..
netusim, hadam dle dle odpovedi jitky
Ahojky tak jsem to pozmenila na
if(!(s & efUnsDec))
if(num < 0)
num-=2*num;
n = num;
a uz mi to proslo,dekuju vam kluci,ale asi je nekde chybka,nikde to nic nic nevypisuje kde jen toto
--- gcc-4.0 prelozeno ---
--- gcc-2.95 prelozeno ---
--- protokol "./test.2.bin" ---
50: "-83178272, -83178272, 4211789024, 037302546340, 0x" (58: "-83178272, -83178272, 4211789024, 037302546340, 0xfb0acce0")
130: "-32, 224, -13088, 52448, -83178272, 4211789024, -83178272, 4211789024 32, 32, 13088, 13088, 83178272, 83178272, 83178272, 83178272" (130: "-32, 224, -13088, 52448, -83178272, 4211789024, -83178272, 4211789024 32, 32, 13088, 13088, 83178272, 83178272, 83178272, 83178272")
28: "@, "Chrchly Chrchly", 64, 0x" (36: "@, "Chrchly Chrchly", 64, 0xbf82e904")
! Chyba: 1
---
--- protokol "./test.1.bin" ---
50: "-83178272, -83178272, 4211789024, 037302546340, 0x" (58: "-83178272, -83178272, 4211789024, 037302546340, 0xfb0acce0")
130: "-32, 224, -13088, 52448, -83178272, 4211789024, -83178272, 4211789024 32, 32, 13088, 13088, 83178272, 83178272, 83178272, 83178272" (130: "-32, 224, -13088, 52448, -83178272, 4211789024, -83178272, 4211789024 32, 32, 13088, 13088, 83178272, 83178272, 83178272, 83178272")
28: "@, "Chrchly Chrchly", 64, 0x" (36: "@, "Chrchly Chrchly", 64, 0xbfa90b58")
! Chyba: 1
---
to by me zajimalo co to jako znamena,se asi pudu zeptat ucitela,nebo nekoho kdo to uz poslat ,jestli se jim to taky objevovalo
No jeste teda kdyz sem se divala co to vypisuju kdyz to maji spraven ostatni tak jim to vypisuje tohle
--- gcc-4.0 prelozeno ---
--- gcc-2.95 prelozeno ---
--- protokol "./test.1.bin" ---
58: "-87279040, -87279040, 4207688256, 037263035100, 0xfacc3a40" (58: "-87279040, -87279040, 4207688256, 037263035100, 0xfacc3a40")
130: "64, 64, 14912, 14912, -87279040, 4207688256, -87279040, 4207688256 -64, 192, -14912, 50624, 87279040, 87279040, 87279040, 87279040" (130: "64, 64, 14912, 14912, -87279040, 4207688256, -87279040, 4207688256 -64, 192, -14912, 50624, 87279040, 87279040, 87279040, 87279040")
36: "`, "Chrchly Chrchly", 96, 0xbfc80638" (36: "`, "Chrchly Chrchly", 96, 0xbfc80638")
---
--- protokol "./test.2.bin" ---
58: "-87279040, -87279040, 4207688256, 037263035100, 0xfacc3a40" (58: "-87279040, -87279040, 4207688256, 037263035100, 0xfacc3a40")
130: "64, 64, 14912, 14912, -87279040, 4207688256, -87279040, 4207688256 -64, 192, -14912, 50624, 87279040, 87279040, 87279040, 87279040" (130: "64, 64, 14912, 14912, -87279040, 4207688256, -87279040, 4207688256 -64, 192, -14912, 50624, 87279040, 87279040, 87279040, 87279040")
36: "`, "Chrchly Chrchly", 96, 0xbff40104" (36: "`, "Chrchly Chrchly", 96, 0xbff40104")
---
jestli je neco blbe zadanyho
To jitkaV6:
Tohle je blbost:
if(!(s & efUnsDec))
if(num < 0)
num-=2*num;
n = num;
Takže já bych to přepsal asi nějak takhle.
if(s & efUnsDec)
n = num;
else{
if(num < 0)
n = -num;
else
n = num;
}
Ale nechce se mi věřit, že to nevezme ternární operátor:
n = (s & efUnsDec)?num : ( num < 0) ? -num : num;
budes muset za ucitelem a promluvit si proc to ten automat nebere, my uz ti pomuzeme asi tezko. Ale mozna az to s ucitelem budete probirat se ukaze ze nejsi autorka kodu, kdyz ti polozi nakou otazku, tak si zkus ten zdrojak poradne nastudovat
To jitkaV6:
Mno, vždy není potřeba překopávat celý algoritmus. Já to psal jednak podle zadání, ale taky jsem to _hlavně_ porovnával s funkcí sprintf, která je definována ve standardu. Možná by taky bylo vhodné napsat, v čem se to liší od ostatních řešení(uveď, jak by měl vypadat správný výstup pro jednotlivé možnosti).
ne to se musis zeptat ucitele. capni laptop a ukaz mu ze tve reseni funguje a on bude muset uznat ze je chyba v automatu nebo ti ukaze jak to prekopat
Tak jsem za nim dneska byla a ukazala mu to.Nerekl jak to mam spravit,jem mi rekl at se snazim dal doladit tak aby to proslo.No neni ten ucitel blbej:(.A kdzy mu rikam jak na to ze je to funkcni,tak mi na to rekne ze si mam pomoct sama,bo se nekoho zeptat,ze at se potrapim.
no tak to je peknej nerad ! sicak jeden, takovejch lidi se s tim trapi a von to pak ani nevezme.
Obavam se ze mas posledni nadeji: najit nekoho kdo to podle Jurova (nebo cele) prepise, tak aby to system vzal. Dorpedu vsak rikam ze si nemyslim ze nekoho takoveho najdes. Je to fakt pech po takovymhle snazeni dostat 4ku nebo myslis ze ti da neco za snahu ?
To je:(,me to tak stve,ani nevis jaka tolik lidi mi pomohlo.No to nevim jako,vazne ne,u neho nikdo nikdy nevi.POdivej mz poslal kamarad svuj kod co mu to proslo,je to tenhle:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int Sprintf(char *str, const char *format, ...)
{
int index_str, index_format, delka, emergency, integer;
unsigned int unsigned_integer, unsigned_kopie;
char* buffer;
char big[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char small[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
#define CONVERSION(soustava)\
for(index_str++, unsigned_kopie=unsigned_integer; (unsigned_kopie/=(soustava)); index_str++);\
for(delka = 1, unsigned_kopie=unsigned_integer; unsigned_kopie>0; unsigned_kopie/=(soustava)){\
if(format[index_format]=='X') str[index_str-(delka++)] = big[unsigned_kopie%(soustava)];\
else str[index_str-(delka++)] = small[unsigned_kopie%(soustava)];}
va_list argument;
va_start(argument, format);
for(index_str=0, index_format=0; format[index_format]!='\0'; index_format++) {
/* pokud jde o normalni znak (ne %) zkopiruj do str*/
if(format[index_format]!='%') str[index_str++] = format[index_format];
else if(format[index_format]=='%') {
/* format hh, signed or unsigned char */
if((format[index_format+1]=='h')&&(format[index_format+2]=='h')) {
integer = va_arg(argument, int);
if((integer<0)&&(format[index_format+3]!='u')) integer = (signed char)integer;
else integer = (unsigned char)integer;
index_format+=2;
}
/* format h, short or unsigned int */
else if((format[index_format+1]=='h')&&(format[index_format+2]!='h')) {
integer = va_arg(argument, int);
if((integer<0)&&(format[index_format+2]!='u')) integer = (signed short int)integer;
else integer = (unsigned short int)integer;
index_format++;
}
/* format l, long or unsigned long int */
else if(format[index_format+1]=='l') {
integer = va_arg(argument, int);
if((integer<0)&&(format[index_format+2]!='u')) integer = (signed long int)integer;
else integer = (unsigned long int)integer;
index_format++;
}
/* konverze */
switch(format[index_format+1]) {
case 'd':
case 'i': if(format[index_format]=='%') integer = va_arg(argument, int);
index_format++;
if(integer<0) {
str[index_str++]='-';
integer=0-integer; /* zmena na kladne cislo */
}
for(index_str++, emergency=integer; (emergency/=10); index_str++);
for(delka = 1, emergency=integer; emergency>0; emergency/=10) {
str[index_str-(delka++)] = small[emergency%10];
}
break;
case 'u': if(format[index_format]=='%') unsigned_integer=(unsigned int)va_arg(argument,int);
else unsigned_integer=integer;
index_format++;
for(delka=1, unsigned_kopie=unsigned_integer; (unsigned_kopie/=10); delka++, index_str++);
for(emergency=0, unsigned_kopie=unsigned_integer; emergency!=delka; emergency++, unsigned_kopie/=10) {
str[index_str-emergency]=small[unsigned_kopie%10];
}
index_str++;
break;
case 'x':
case 'X':
case 'o': if(format[index_format]=='%') unsigned_integer=(unsigned int)va_arg(argument,int);
else unsigned_integer=integer;
index_format++;
/* převod do osmickove soustavy */
if(format[index_format]=='o') {CONVERSION(8)}
/* převod na sesnactkove soustavy */
if((format[index_format]=='x')||(format[index_format]=='X')) {CONVERSION(16)}
break;
case 'c': integer = (unsigned char)va_arg(argument, int);
index_format++;
str[index_str] = integer;
index_str++;
break;
case 's': buffer = (char*)va_arg(argument, const char*);
for(emergency=0; buffer[emergency]!='\0'; emergency++) str[index_str++] = buffer[emergency];
index_format++;
break;
case 'p': unsigned_integer = (unsigned int)va_arg(argument, void*);
index_format++;
str[index_str++]='0';
str[index_str++]='x';
CONVERSION(16)
break;
case '%': str[index_str++] = '%';
index_format+=2;
break;
}
}
}
va_end(argument);
str[index_str]='\0';
return index_str;
}
/* testovani funkce */
int main(int argc, char *argv[])
{
char test;
Sprintf(&test, "%u", 3078079126);
printf("%s ", &test);
system("PAUSE");
return 0;
}
tohle mu tim automatem bez problemu proslo,ja nevim jestli to mam udelat nejak tak jak on,ja uz vazne nevim.
Tak tohle mi napsal kamarad:
Jinak chyba 1 představuje chybu ve výsledku, prostě ti ta funkce vypisuje špatný výsledky.
Podle výsledku je chyba na 100% ve výpisu void pointeru, v převodu do různých soustav
(tam se ti výsledky nevypisují vůbec), ve výpisu charu do řetězce (ten se taky vůbec nevypisuje).
Jinak některý čísla se ti převádí špatně, protože nesouhlasí s výsledkem.
nevite nekdo co stim.
jeste teda,kdo by mi s tim pomohl poslu svuj zdrojovy kod.
Poslušně hlasím, že jsem testoval výstup s programem, který jsi zde uvedla(od tvého kamaráda) s výstupem Sprintf, který jsem dal na builder.cz a žádný rozdíl jsem nepozoroval. Takže chyba bude patrně v nějaké úpravě, kterou jsi provedla. A bez zdrojáku, ti nikdo neporadí.
To Jura_:tak tady je ten zdrojak:
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
enum
{ eNone = 0x00, efShort = 0x02, efLong = 0x04,
efChar = 0x08, eInt = 0x10, eString = 0x20,
efUnsDec = 0x40, eChar = 0x80, eOctal = 0x200,
eHexa = 0x400, eBigHexa = 0x800, ePointer = 0x1000
};
int Sprintf(char *str, const char *format, ...)
{
va_list l;
char * pch = (char*)format, *p1, *p2;
char* start = str;
char temp[128];
long num;
unsigned long n;
int i, t, s, len = 0;
if(str == 0) return -1;
va_start(l, format);
for (;*pch;)
{ if(*pch == '%')
{ for(pch = pch +1;*pch >= '0' && *pch<='9'; )
len = len * 10 + *pch++ - '0';
s = eNone;
if(*pch == 'l'){ s = efLong; pch ++;}
if(*pch == 'h'){ s = efShort; pch ++;}
if(s == efShort && *pch == 'h'){ s = efChar; pch ++;}
switch(*pch)
{
case 'i':
case 'd': s |= eInt; pch ++; break;
case 's': s = eString;pch ++; break;
case 'u': s |= efUnsDec;pch ++; break;
case 'c': s = eChar; pch ++; break;
case 'o': s |= eOctal;pch++; break;
case 'x': s |= eHexa;pch++; break;
case 'X': s |= eBigHexa;pch++;break;
case 'p': s = ePointer;pch++; break;
};
if(s == eNone) *str++ = *pch++;
else if(s == eString)
{ p1 = va_arg(l,char*);
for(p2=p1;*p2; ++p2, ++str)
{ if(len && (p2-p1) >= len) break;
*str = *p2;
}
}
else if(s == ePointer)
{ *str++ ='0';*str++ = 'x';
num = (long)va_arg(l, void*);
for(i=0; num > 0;num /= 16, ++i)
{ t = num % 16;
if(t > 9) { t %= 10; temp[i] = 'a'+t;}
else temp[i] = t + '0';
}
for(;i > 0;) *str++ = temp[--i];
}
else if(s == eChar)
{ *str++ = (unsigned char)va_arg(l, int);
}
else {
num = va_arg(l, long);
if(s & efShort) num = (s & efUnsDec)?(unsigned short)num:(short)num;
else if(s & efChar) num = (s & efUnsDec)?(unsigned char)num:(char)num;
if(s & eInt)
{ num = (int)num;
n = num < 0 ? -num : num;
if(num < 0) *str++ = '-';
for(i=0; n > 0; n /= 10, ++i)
temp[i] = n % 10 + '0';
}
else if(s & eOctal)
{ num = (unsigned int)num;
n = num;
for(i=0; n > 0; n /= 8, ++i)
temp[i] = n % 8 + '0';
}
else if((s & eHexa)||(s & eBigHexa))
{ num = (unsigned int)num;
for(i=0; num > 0;num /= 16, ++i)
{ t = num % 16;
if(t > 9) { t %= 10; temp[i] = (s & eBigHexa)?'A'+t:'a'+t;}
else temp[i] = t + '0';
}
}
else
{
if(s & efUnsDec)n = num;
else{
if(num < 0)
n = -num;
else
n = num;
}
if(num < 0 && !(s & efUnsDec)) *str++ = '-';
for(i=0; n > 0; n /= 10, ++i)
temp[i] = n % 10 + '0';
}
for(;i > 0; ) *str++ = temp[--i];
}
}
else
*str++ = *pch++;
}
*str = '\0';
va_end(l);
return str - start;
}
int main(int argc, char** argv[])
{ char buf[512];
int len = Sprintf(buf, "%d-%d=%d", -1, 4, -1-4);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "20%% ze 100 je %d", 100/5);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "-1000 v osmickove soustave je %o", -1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1000 v hexa soustave je %x nebo %X.", 1000, 1000);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Znak %c nebo %hhc.", 165, 165);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "Adresa buf je %p.", buf);
printf("%s\nVytisknuto %d znaku.\n", buf, len);
len = Sprintf(buf, "1. dva znaky ze slova %s jsou %2s\n", "Pepiku", "Pepiku");
printf("%sVytisknuto %d znaku.\n", buf, len);
system ("PAUSE");
return 0;
}
tak tohle je ten muj poupraveny kod,ktery mi tim projde.co jsem se divala,tak te n vystup je stejnej
To jitkaV6:
Takhle to nikam nevede. Zkoušel jsem porovnávat výstup programu s progrmam, který jsi tu předvedla a jediný rozdíl jsem pozoroval u znaků(ten Sprintf, co jsme dali do kupy vypisuje presne standardniho sprintf, ten od tvého kámaráda vypisuje nějaké jiné klikyháky). Takže zkus zajít za učitelem, a požádat ho, aby ti napsal nějaký příklad a formát výpisu - že to nemáš podle čeho odladit, když neznáš výstup.
To Jura:
takze jsem zjistil ze mi to musi vyhazovtat to co je v zavorkach u toho vypisu
--- gcc-4.0 prelozeno ---
--- gcc-2.95 prelozeno ---
--- protokol "./test.2.bin" ---
44: "-1600454976, -1600454976, , 024046577300, 0x" (62: "-1600454976, -1600454976, 2694512320, 024046577300, 0xa09afec0")
83: "-64, , -320, , -1600454976, , -1600454976, 64, , 320, , 1600454976, , 1600454976, " (136: "-64, 192, -320, 65216, -1600454976, 2694512320, -1600454976, 2694512320 64, 64, 320, 320, 1600454976, 1600454976, 1600454976, 1600454976")
28: " , "Chrchly Chrchly", 32, 0x" (36: " , "Chrchly Chrchly", 32, 0xbff76844")
! Chyba: 1
---
--- protokol "./test.1.bin" ---
44: "-1600454976, -1600454976, , 024046577300, 0x" (62: "-1600454976, -1600454976, 2694512320, 024046577300, 0xa09afec0")
83: "-64, , -320, , -1600454976, , -1600454976, 64, , 320, , 1600454976, , 1600454976, " (136: "-64, 192, -320, 65216, -1600454976, 2694512320, -1600454976, 2694512320 64, 64, 320, 320, 1600454976, 1600454976, 1600454976, 1600454976")
28: " , "Chrchly Chrchly", 32, 0x" (36: " , "Chrchly Chrchly", 32, 0xbf89a168")
! Chyba: 1
---
.A jeste mi rikal ze podle toho co mi to vypisuje je chyba nekde v prevodu na kladne cisla a taky u toho
p The void * pointer -ze je tam ma taky asi chybu ze to nevypisuje co ma.
Sem to dneska ten vypis ukazovala kamaradovi a ten mi rikal ze ten pointr uz je dobrej, znaky ze fungují, řetězce taky, ale chyba je ještě pry v číslech někde v hh, h a l.Myslis ze to muze byt tim,ja teda nevim.
Jinal ten pointer jsem uz spravila i ten prevod na kladny cisla,ted uz jen tohle a je to hotovy
potreboval bych pomoct s timto kodem, ukazateli se tu přiřadí objekt ve volném úložišti, ale několikrát a přece se nemůže ukazateli přiradit více objektů ne ? tak jak to teda prosim funguje ?
// Ukazuje objektově orientovaný přístup k propojeným
// seznamům. Seznam deleguje činnost uzlu. Uzel je
// abstraktní datový typ. Používají se tři typy uzlů:
// uzly hlavy, uzly ocasu a vnitřní uzly. Data
// obsahují pouze vnitřní uzly.
//
// Třída Data je vytvořena, aby sloužila jako objekt
// k uchování v daném propojeném seznamu.
//
// ***********************************************
#include <iostream>
using namespace std;
enum { kJeMensi, kJeVetsi, kJeStejny};
// Třída Data pro vložení propojeného seznamu. Každá
// třída v propojeném seznamu musí podporovat dvě metody:
// Zobrazit (zobrazí hodnotu) a
// Porovnat (vrátí relativní pozici)
class Data
{
public:
Data(int hodnota):mojeHodnota(hodnota){}
~Data(){}
int Porovnat(const Data &);
void Zobrazit() { cout << mojeHodnota << endl; }
private:
int mojeHodnota;
};
// Porovnat se používá k určení, kam do seznamu
// určitý objekt patří.
int Data::Porovnat(const Data & jinaData)
{
if (mojeHodnota < jinaData.mojeHodnota)
return kJeMensi;
if (mojeHodnota > jinaData.mojeHodnota)
return kJeVetsi;
else
return kJeStejny;
}
// Dopředné deklarace
class Uzel;
class UzelHlavy;
class UzelOcasu;
class VnitrniUzel;
// ADT představující objekt uzlu v seznamu
// Každá odvozená třída musí překrýt Vlozit a Zobrazit
class Uzel
{
public:
Uzel(){}
virtual ~Uzel(){}
virtual Uzel * Vlozit(Data * taData)=0;
virtual void Zobrazit() = 0;
private:
};
// Toto je uzel, který obsahuje vlastní objekt
// V tomto případě jde o objekt typu Data
// Uvidíme, jak to učinit obecněji, až si budeme
// povídat o šablonách
class VnitrniUzel: public Uzel
{
public:
VnitrniUzel(Data * taData, Uzel * dalsi);
~VnitrniUzel(){ delete mujDalsi; delete mojeData; }
virtual Uzel * Vlozit(Data * taData);
// Delegovat!
virtual void Zobrazit() { mojeData->Zobrazit(); mujDalsi->Zobrazit();}
private:
Data * mojeData; // samotná data
Uzel * mujDalsi; // ukazuje na další uzel v propojeném seznamu
};
// Konstruktor jenom inicializuje
VnitrniUzel::VnitrniUzel(Data * taData, Uzel * dalsi):
mojeData(taData),mujDalsi(dalsi)
{
}
// Základ celého seznamu
// Když do seznamu vložíte nový objekt,
// předá se uzlu, který určí jeho pozici
// a vloží jej do seznamu
Uzel * VnitrniUzel::Vlozit(Data * taData)
{
// Je ten nový hoch větší nebo menší než já?
int vysledek = mojeData->Porovnat(*taData);
switch(vysledek)
{
// Je li stejný jako já, pak podle konvence patří přede mě
case kJeStejny: // projít dál
case kJeVetsi: // nová data patří přede mě
{
VnitrniUzel * datovyUzel = new VnitrniUzel(taData, this);
return datovyUzel;
}
// Je větší než já, takže jej předáme dalšímu
// uzlu a ponecháme na NĚM, ať se stará.
case kJeMensi:
mujDalsi = mujDalsi->Vlozit(taData);
return this;
}
return this; // naplnit MSC
}
// Uzel ocasu je jen hlídka
class UzelOcasu : public Uzel
{
public:
UzelOcasu(){}
~UzelOcasu(){}
virtual Uzel * Vlozit(Data * taData);
virtual void Zobrazit() { }
private:
};
// Pokud nějaká data přijdou až ke mně, musí se vložit
// přede mě, protože já jsem ocas a za mnou už není NIC.
Uzel * UzelOcasu::Vlozit(Data * taData)
{
VnitrniUzel * datovyUzel = new VnitrniUzel(taData, this);
return datovyUzel;
}
// Uzel hlavy neobsahuje žádná data, jenom
// ukazuje na úplný začátek seznamu
class UzelHlavy : public Uzel
{
public:
UzelHlavy();
~UzelHlavy() { delete mujDalsi; }
virtual Uzel * Vlozit(Data * taData);
virtual void Zobrazit() { mujDalsi->Zobrazit(); }
private:
Uzel * mujDalsi;
};
// Jakmile se vytvoří hlava, vytvoří se
// také ocas.
UzelHlavy::UzelHlavy()
{
mujDalsi = new UzelOcasu;
}
// Před hlavou nic není, takže data
// jen předáme dalšímu uzlu.
Uzel * UzelHlavy::Vlozit(Data * taData)
{
mujDalsi = mujDalsi->Vlozit(taData);
return this;
}
// Mám všechny zásluhy a přitom nic nedělám.
class PropojenySeznam
{
public:
PropojenySeznam();
~PropojenySeznam() { delete mojeHlava; }
void Vlozit(Data * taData);
void ZobrazitVse() { mojeHlava->Zobrazit(); }
private:
UzelHlavy * mojeHlava;
};
// Při zrození vytvořím uzel hlavy.
// Ten vytvoří uzel ocasu, takže
// prázdný seznam ukazuje na hlavu, která
// ukazuje na ocas a mezi nimi nic není.
PropojenySeznam::PropojenySeznam()
{
mojeHlava = new UzelHlavy;
}
// Deleguji, deleguješ, delegujeme
void PropojenySeznam::Vlozit(Data * pData)
{
mojeHlava->Vlozit(pData);
}
// Testovací program
int main()
{
Data * pData;
int hodnota;
PropojenySeznam ps;
// Požádat uživatele a zadání nějakých hodnot
// a vložit je do seznamu.
for (;;)
{
cout << "Jaka hodnota? (konec = 0): ";
cin >> hodnota;
if (!hodnota)
break;
pData = new Data(hodnota);
ps.Vlozit(pData);
}
// Nyní projít seznamem a zobrazit data
ps.ZobrazitVse();
cin.get();
cin.get();
return 0; // ps vypadne z oboru platnosti a je zrušen!
}
tak prosim kdyby nekdo vedel tak at to sem napise, diky
Jedná se o jednosměrný spojový seznam(tento konkrétně využívá fiktivní hlavní i koncový uzel). Je to jedna ze tzv. dynamických datových struktur. Každý uzel(u tebe Vnitřní uzel) obsahuje nějaká data(pointer na Data) a ukazatel na další uzel. Díky tomu, že obsahuje tento ukazatel na další prvek, tak můžeš tyto prvky spojovat do řetězce. Jenže je jasné, že si někde musíš pamatovat začátek totoho řetezu(aby jsi se k těm datům nějak dostal), u tebe konkrétně si jej pamamtuješ ve třídě PropojenySeznam. Tahle implementace pochazí tuším z knihy "Naučte se C++ za 21 dní" a úpřímně mně celá tato kniha, tak nějak...zklamala. Implementace je zbytečně složitá pro začatečníka(volba fiktivního hlavního a koncového uzlu podle mého do začátku rozhodně vhodná není), ještě když uvážím, že autor používá látku, kterou ještě neprobral - polymorfismus. Nicméně abych se vrátil k tématu, pokud si to chceš prostudovat, myslím teorii - implemtace není zase tak složitá, tak doporučuju si zkusit něco vyhledat googlem.
Ono to tak ze začátku jen vypadá, že pData ukazují pořád na ty stejné data v paměti. Ale skutečost je jiná, při každém zavolání operátoru new dochází k NOVÉMU hledání místa v haldě(heap). Tím pádem new alokuje pokaždé na jiném místě, tzn. pokud ti to pomůže,tak pData v každém půchodu cyklu ukazuje na jinou ADRESU. Jen takové doplnění - v C++ ještě existuje tzv.placement(??) new, tomu předáš adresu kam se mají data jakoby alokovat(ve skutečnosti se nealokuje nic), ale to je jen na okraj, rozhodně se tím nemusíš ze začátku zatěžovat. A taková malá poznámka na závěr, určitě nepoužívej označení volné úložiště, myslím, že se to ani nepoužívá, raději dej přednost označení heap(česky halda).
Nikdo by mi prosim Vas neporadil ten vypis ukazuje:
--- gcc-4.0 prelozeno ---
--- gcc-2.95 prelozeno ---
--- protokol "./test.1.bin" ---
59: "-109725520, -109725520, 4185241776, 0-642443520, 0x-68a4750" (60: "-109725520, -109725520, 4185241776, 037135334260, 0xf975b8b0")
136: "-80, 176, -18256, 47280, -109725520, 4185241776, -109725520, 4185241776 80, 80, 18256, 18256, 109725520, 109725520, 109725520, 109725520" (136: "-80, 176, -18256, 47280, -109725520, 4185241776, -109725520, 4185241776 80, 80, 18256, 18256, 109725520, 109725520, 109725520, 109725520")
36: "0, "Chrchly Chrchly", 48, 0xbf89af28" (36: "0, "Chrchly Chrchly", 48, 0xbf89af28")
! Chyba: 1
---
--- protokol "./test.2.bin" ---
59: "-109725520, -109725520, 4185241776, 0-642443520, 0x-68a4750" (60: "-109725520, -109725520, 4185241776, 037135334260, 0xf975b8b0")
136: "-80, 176, -18256, 47280, -109725520, 4185241776, -109725520, 4185241776 80, 80, 18256, 18256, 109725520, 109725520, 109725520, 109725520" (136: "-80, 176, -18256, 47280, -109725520, 4185241776, -109725520, 4185241776 80, 80, 18256, 18256, 109725520, 109725520, 109725520, 109725520")
36: "0, "Chrchly Chrchly", 48, 0xbfc1c4f4" (36: "0, "Chrchly Chrchly", 48, 0xbfc1c4f4")
! Chyba: 1
---
Chyba je jen na prvnich radcih posledni dve sadach cislic.Kdyz se tohle spravi tak se to uz uzna.Nepodival se na to nekdo prosmi vas,kod tomu rozumi.OCenuji lidi kdo mi s timhle programem pomohli,uz jen proto chci aby to proslo.Moc prosim dekuji.
![](img/forum_nove_psp_new.png)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/32.gif)
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Pomuze nekdo ? — založil Tod
Zahraje nekdo? — založil Jan Malý
Pomuže mi někdo? — založil f.d.
Poradí někdo ;) — založil ajva
Umi někdo? — založil kesinka839
Moderátoři diskuze