CURL, přibívající znaky – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

CURL, přibívající znaky – C / C++ – Fórum – Programujte.comCURL, přibívající znaky – C / C++ – Fórum – Programujte.com

 

31. 5. 2011   #1
-
0
-

Dobrý den,
napsal jsem program, který počítá z určitého rozsahu různé kombinace od délky 1znaku do 255 znaku. ovšem, když jsem připojil knihovnu CURL a v tom samém programu si začnu hrát s metodou HTTP POST. Chtěl bych ty kombinace jednou posílat na server a ukládat do MySQL. Tak se mi u výpisu začne těchto kombincí objevovat znak "$".

Jde o to, že vypisuji do konzozole na windowsu {výsledek z HTTP serveru} --- {kombinace}

Tudíš by se mělo zobrazovat např "jo --- abcd" ... ale ve chvíly kdy použiju funkci curl_formadd() začne se objevovat "jo --- abcd $". Původně jsem myslel, že se překrývají paměťová místa proměných, proto jsem použil malloc. Nepomohlo.

Chtěl bych tedy touto formou požádat o radu.



#include <iostream>
#include <stdio.h>
#include "curl/include/curl/curl.h"

using namespace std;

//char MapaZnaku[]="aábcčdďeéěfghchiíjklmnňoópqrřsštťuúůvwxyýzžAÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚŮVWXYÝZŽ0123456789~!@#$%^&*()_+`=-[]\;',./{}|:>?< ";
char MapaZnaku[]="abcd";
int MaxPocetMist=4;
char* MainServer="http://localhost/md5/";
int MaxPocetVysledku=10000000;

int main(void){
int i;
int p;
int PocetZnaku=sizeof(MapaZnaku)-1;
char TestovaciRetezec[MaxPocetMist];
for(i=0;i<MaxPocetMist;TestovaciRetezec[i++]=NULL);
signed int HodnotaPozice[MaxPocetMist];
for(i=0;i<MaxPocetMist;HodnotaPozice[i++]=-1);
int AktualniPocetMist=1;
int AktualniMisto=0;
char Stop;
struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
char* Dotaz;
char* Value;
Dotaz = (char*)malloc(25);
Value = (char*)malloc(25);

Dotaz="dotaz"; //jméno post políčka
Value="ok"; //jeho hodnota

i=0;

CURL *curl;
CURLcode res;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/md5/PridelRozsah.php");




int kolikaty=0;
while(kolikaty < MaxPocetVysledku){
HodnotaPozice[AktualniMisto]++;
if(HodnotaPozice[AktualniMisto] == PocetZnaku){
HodnotaPozice[AktualniMisto]=0;
AktualniMisto++;
continue;
};
if(AktualniPocetMist < AktualniMisto+1){
AktualniPocetMist++;
}

if (AktualniPocetMist > MaxPocetMist){
break;
};

AktualniMisto=0;

for(p=0;p<AktualniPocetMist;TestovaciRetezec[p]=MapaZnaku[HodnotaPozice[p++]]);


curl_formadd(&formpost,
&lastptr,
CURLFORM_PTRNAME, Dotaz,
CURLFORM_PTRCONTENTS, Value,
CURLFORM_END);

curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_perform(curl);
cout << TestovaciRetezec << endl;
kolikaty++;
};
cout << "konec";
curl_formfree(formpost);
curl_easy_cleanup(curl);
cin >> kolikaty;

return 1;
};



Problém se začne objevovat, až když program dojde ke 4 místným kombinacím. Ale když smažu řádek s fcí curl_formadd(). problém zmizí a vypisuje se vše už bez znaku "$", ovšem zase program nepostuje nic HTTP serveru. Přikládám obrázek
Obrázek programu:

Nahlásit jako SPAM
IP: 213.151.86.–
_Radek_
~ Anonymní uživatel
88 příspěvků
31. 5. 2011   #2
-
0
-

Zdravim,
sice to nejspíše není odpověď přímo na váš dotaz a v C už jsem chvíli nedělal, ale první co mě zaráží je tento kousek kódu:



int MaxPocetMist=4;
...
char TestovaciRetezec[MaxPocetMist];

osobně bych proměnnou deklaroval jako const int. I když je možné, že to kompilátor vyoptimalizuje, je to ale také jeden z důvodů, proč se pro takové vytváření proměnných používá operátor new.
Z vlastní zkušenosti vím, že s některými kompilátory to jinak nedělá dobrotu :-)

Nahlásit jako SPAM
IP: 91.187.60.–
KIIV
~ Moderátor
+43
God of flame
31. 5. 2011   #3
-
0
-

me zase zaujalo:

        char* Dotaz;

char* Value;

Dotaz = (char*)malloc(25);
Value = (char*)malloc(25);

Dotaz="dotaz"; //jméno post políčka
Value="ok"; //jeho hodnota

memory leak - alokujes data a pak to preplacnes ukazatelem na uplne neco jinyho


+ k cemu tam mas stdio.h ?

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
31. 5. 2011   #4
-
0
-

Ahoj,

problém už jsem vyřešil. Nicméně jak jste asi poznali, jsem v Cčku začátečník. I PHP jsem se učil takovýmto způsobem (přečetl si tutorialy a pak pokus/omyl) a dneska si troufám říci, že v PHPčku udělám témeř cokoli a i můj kód vypadá k světu (co by člověk po 7 letech nechtěl, že :) )... U C jsem ve fázi,kdy zkouším, mám za sebou jenom základní tutoriály a v blízkosti bohužel nikoho, kdy by C uměl a mohl mi pomáhat. Proto se ptám.

Vím, že MaxPocetMist jsem mohl udělat jako const int. Ale v čem je mezi int a const int rozdíl, když pominu, že const před typem z něj udělá akorát konstantu, tudíš jeho hodnotu v kódu už nemůžu měnit. Technicky to to int nezmění ne? nebo ano? v čem?

Co se týče malloc. Měl (resp mám) za to, že když vytvořím ukazatel na char ...resp char* Promena; vytvoří to proměnou o který systém ví, že bude nějakým způsobem pracovat s daty, které jsou uloženy jako char, ale že hodnota týhle proměný bude adresa v 16-kové soustavě. Potom, když si nechám vypsat třeba cout << *Promena;, tak tou hvezdickou řikám, abysi systém vzal hodnotu týhle proměný, použil jí jako adresu a na to daný místo se koukl a vytáhl data z toho místa a zpracoval jako (v mém případě) char. ... funkcí malloc jsem si nechal alokovat místo pro proměnou char dlouhou x počet znaků. funkce mi vrátila adresu, resp počáteční bod, a ten jsem nahrál do proměné Dotaz. Poté jsem na to místo v paměti přes proměnou dotaz uložil data "dotaz". Co jsem tedy udělal špatně?


Určitě uvítám vaše postřehy a připomínky :)

S pozdravem,
Michal

Nahlásit jako SPAM
IP: 94.112.250.–
KIIV
~ Moderátor
+43
God of flame
31. 5. 2011   #5
-
0
-

To Lokutus7323 : ukazatel je jen cislo (adresa umisteni dat v pameti)

a kdyz udelas:
char * neco = malloc( sizeof(char) * 25 );
tak priradis do neco adresu, kam mas ukladat data.
to muze byt napriklad 0x12345342

no a ted mas hned pote:
neco = "dotaz";
co to udela? je to pole znaku takze to veme ADRESU zadacku tech dat a tu adresu ti hodi do "neco"

tj. mas tam pak nejakou uplne jinou adresu, a tu alokovanou si definitivne ztratil protoze sis ji prepsal.

pokud chces do promenne zkopirovat nejaky retezed (ted je tam dulezity to "zkopirovat") tak musis pouzit napriklad strcpy
(ze string.h) nebo to zkopirovat sam.


schvalne si ty ukazatele vypis...

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
_Radek_
~ Anonymní uživatel
88 příspěvků
31. 5. 2011   #6
-
0
-

Jaj, omlouvám se. Const int v tomto případě nejspíše opravdu nepomůže. Ale chvíli jsem si s tím hrál a pokud deklarujete proměnnou jako obyčejný int, tak MS Visual C++ to v tomto případě vyoptimalizuje tak, že za tuto proměnnou dosadí přímo hodnotu. Tedy jako by jste použil následující:

#define MaxPocetMist 4

A ve výsledném kódu se proměnná nikde v paměti neobjeví. Tedy za předpokladu, že proměnnou jinde v kódu neměníte.

Ale stále si myslím, že je používání proměnných pro určení velikostí polí dost matoucí. Navíc pokud nedej bože proměnnou přeci jenom dále v kódu změníte a podaří se vám to přeložit, může to vést k bugům, které se špatně hledají.

Jen maličkost, o kterou jsem se chtěl podělit :)

Nahlásit jako SPAM
IP: 91.187.60.–
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, 138 hostů

Podobná vlákna

CURL — založil wise

Curl — založil lamous

Curl — založil wise

Nalinkovani curl — založil marc_ramin

Lib cURL — založil cniry

Moderátoři diskuze

 

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