Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

problem podczas kompilacji programu z lekcji o bibliotece RapidXML

Ostatnio zmodyfikowano 2013-10-12 22:20
Autor Wiadomość
tookie009
Temat założony przez niniejszego użytkownika
problem podczas kompilacji programu z lekcji o bibliotece RapidXML
» 2013-10-12 20:33:34
(Udało mi się zlinkować bibliotekę curl ), ażeby móc wykonać program z strony http:cpp0x.plartykuly?id=50

niestety otrzymuje nadal błędy:



1>Build started 2013-10-12 19:57:07.
1>InitializeBuildStatus:
1>  Touching "Debug\xmlzstrony.unsuccessfulbuild".
1>ClCompile:
1>  xmlzstrony.cpp
1>xmlzstrony.cpp(52): warning C4244: 'initializing' : conversion from '__int64' to 'unsigned int', possible loss of data
1>xmlzstrony.cpp(58): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int


Spotkał się ktoś już z czymś takim? Czy winą może być nieodpowiednia wersja zlib ?


EDIT: mój kod:
C/C++
#include <iomanip>
#include <iostream>
#include <memory>
#include <string>
// <curl.h>
#include "curl/include/curl/curl.h"
#include "rapidxml.hpp"
#include "rapidxml_print.hpp"
#include "rapidxml_utils.hpp"

using namespace std;
using namespace rapidxml;

static string buffer;

inline static int string_writer( char * data, size_t size, size_t nmemb, string * buffer ) {
    int result = 0;
    if( buffer != NULL ) {
        buffer->append( data, size * nmemb );
        result = size * nmemb;
    }
    return result;
}

inline static char * pobierzStrone( char * strona ) {
    bool byl_problem = false;
   
    do {
        buffer.reserve( 10000 );
        buffer.clear();
        CURL * curl;
        CURLcode result;
       
        curl = curl_easy_init();
        if( curl ) {
            curl_easy_setopt( curl, CURLOPT_URL, strona );
            curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, string_writer );
            curl_easy_setopt( curl, CURLOPT_WRITEDATA, & buffer );
           
            result = curl_easy_perform( curl );
            if( result == CURLE_OK )
                 byl_problem = false;
            else {
                cout << "!Wystapil blad podczas pobierania strony, powtarzam czynnosc!\n";
                byl_problem = true;
            }
            curl_easy_cleanup( curl );
        }
    } while( byl_problem );
   
    long long N = buffer.length();
    char * out = new char[ N + 1 ];
    ::copy( buffer.c_str(),( buffer.c_str() + N - 1 ), out );
    out[ N - 1 ] = '\0';
    return out;
}

main() {
    char countries_address[] = "http://api.erepublik.com/v2/feeds/countries";
   
    auto_ptr < char > tresc_strony( pobierzStrone( countries_address ) );
   
    xml_document <> dokument;
    try {
        dokument.parse < 0 >( tresc_strony.get() );
    } catch( parse_error p ) {
        p.what();
    }
   
    xml_node <> * kraje = dokument.first_node();
    unsigned ilosc_krajow = count_children( kraje );
    cout << "Mamy w grze: " << ilosc_krajow << " krajow\n";
    for( xml_node <> * kraj = kraje->first_node(); kraj; kraj = kraj->next_sibling() )
         cout << " * w kraju: " << setw( 30 ) << left << kraj->first_node( "name" )->value() << " jest graczy: " << setw( 6 ) << right << kraj->first_node( "citizen-count" )->value() << '\n';
   
    dokument.clear();
} // g++-4.6 -std=c++0x -lcurl -o erepy.exe  erepy.cc && ./erepy.exe
P-93568
Monika90
» 2013-10-12 20:40:55
Czy winą może być nieodpowiednia wersja zlib ?
Raczej błędy w programach z tego artykułu oraz twoja nieznajomość podstaw C++.
P-93569
tookie009
Temat założony przez niniejszego użytkownika
» 2013-10-12 20:46:50
określilem funkcje main na typ int, i na końcu zwracam 0. Kompilacja udaje się, ale dostaję teraz przy starcie programu:



Unhandled exception at 0x013421e2 in xmlzstrony.exe: 0xC0000005: Access violation reading location 0x00000018.


Jakieś pomysły?

@Monika90 są błędy na tej stronie ? Szczerze powiedziawszy na razie chciałem tylko zmałpować ten kod, ażeby potem patrzeć jak wszystko "leci" w "rzeczywistości"
P-93570
Monika90
» 2013-10-12 20:52:36
są błędy na tej stronie ?
No chyba sam widzisz że są. Autor nie wiedział, że jak się definiuje funkcję to trzeba podać typ zwracany.

Nie wiedział też, że auto_ptr nie może być używany z tablicami. A wystarczyło po prostu zwrócić std::string lub std::vector<char> zamiast robić jakieś new i copy.
P-93573
tookie009
Temat założony przez niniejszego użytkownika
» 2013-10-12 20:57:07
dobrze wiedzieć... Zatem popróbuje pouczyć się czystego curla, a potem ew. jakąś biblioteczkę do xml sobie zmajdę. Szkoda tylko, że nie ma nic po polsku do curla, a słyszałem że oryginalna dokumentacja za "lekka" dla nowicjusza w dodatku nie jest.
P-93574
Monika90
» 2013-10-12 22:20:52
A przykładowy program się wywala, ponieważ zwrócony przez serwer dokument xml nie odpowiada jego oczekiwaniom.
P-93582
« 1 »
  Strona 1 z 1