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

c_str() nic nie zwraca

Ostatnio zmodyfikowano 2013-01-11 17:45
Autor Wiadomość
Elaine
» 2013-01-09 16:21:47
2) dodatkowe pole w klasie - ale to w praktyce sprawia, że trzeba zarządzać drugą zmienną, której zawartość jest identyczna do tej, która została zapisana w klasie
Niekoniecznie, w C++03 string mógł być nieciągły. I wtedy też coś takiego byłoby sensowną implementacją c_str i data.
P-73457
czosnek17
Temat założony przez niniejszego użytkownika
» 2013-01-09 19:55:33
To niestety też nie działa. Odkryłem jednak coś dziwnego.
To działa:
C/C++
string tekst2 = "argh";
const char * napis2 = tekst2.c_str();
cout << "N1:" << napis2 << endl;
cout << "N2:" << tekst2.c_str() << endl;
Ale jak zamienię argh na zmienną podwr:
C/C++
string tekst2 = podwr;
//...
Nie działa.
C/C++
string zxc = "ahaha";
string tekst2 = zxc;
//...
To też nie. Czyli mogę dać wartość zmiennej tylko przez dosłowne jej podanie? O_O

P-73487
DejaVu
» 2013-01-09 20:18:34
Sprawdź czy ze słowem kluczowym static działa. Zresztą... ciągniesz ten temat jako 'nie do wiary' zamiast zajrzeć w kod źródłowy funkcji, którą wywołujesz by zobaczyć jak ona działa.
P-73490
czosnek17
Temat założony przez niniejszego użytkownika
» 2013-01-09 22:16:23
Sprawdź czy ze słowem kluczowym static działa.
Pokombinowałem i oczywiście nie.

Zresztą... ciągniesz ten temat jako 'nie do wiary' zamiast zajrzeć w kod źródłowy funkcji, którą wywołujesz by zobaczyć jak ona działa.
Ok, ale jak podejrzeć ten kod? W internecie nie znalazłem.
P-73510
DejaVu
» 2013-01-09 22:39:10
Eh... pobierasz źródła biblioteki i szukasz funkcji w odpowiednim pliku. Gdybyś samodzielnie kompilował wszystkie biblioteki to byś nawet debuggerem mógł tam wejść.

/edit:
No jeszcze jest opcja, że używasz jakiegoś starego kompilatora MinGW, który może mieć bugi i właśnie objawia Ci się jeden z nich.
P-73511
czosnek17
Temat założony przez niniejszego użytkownika
» 2013-01-10 19:56:06
Ściągnąłem najnowszego Code Blocksa, chyba nie muszę mówić czy działa...
Jeżeli chodzi o szukanie tej funkcji to nie chce mi się przekopywać biblioteki string. Zamiast robić pole tekstowe skorzystam z funkcji kopiującej tekst do schowka. Program będzie mniej efektowny, ale przynajmniej działający.
Mimo wszystko dzięki za pomoc :)
edit, otwieram
Nie użyłem też tej funkcji z tego samego powodu, co poprzednio. Drążyłem dalej i mam wniosek:
Jeżeli podam wartość zmiennej string "w ten sposób", wtedy wszystko działa. Gdy jednak składam stringa w pętli to nie działa.
C/C++
do
{
    cout << txt[ licznik ] << endl << endl;
   
    podwr += txt[ licznik ];
    licznik--;
} while( licznik != - 1 );

Gdy za pętlę dam linijkę podwr = "cos"; to wtedy działa. Dlaczego? To dalej może być coś z c_str()? Przecież string ma wartość i nie powinno być ważne w jaki sposób ją otrzymał.
P-73535
DejaVu
» 2013-01-10 21:28:52
Weź lepiej daj cały kod... irytuje mnie już ten temat i jego 'magiczność'. Nie ma opcji, aby std::string działał źle.
P-73536
czosnek17
Temat założony przez niniejszego użytkownika
» 2013-01-10 21:43:22
irytuje mnie już ten temat i jego 'magiczność'
Mnie też i to bardzo. Ale "są na świecie..."

Program powinien skopiować wpisany tekst do schowka. To, o czym mówiłem w poprzednim poście jest w 41 i 42 linijce.
C/C++
#include <gtk/gtk.h>
#include <iostream>
#include <string>
#include <cstring>
#include <windows.h>
using namespace std;

struct struktura
{
    GtkWidget * sokno;
    GtkWidget * entinp;
    GtkWidget * entout;
    string stx;
};

using namespace std;

void sprawdz_dlugosc( int & dlugosc, string txt )
{
    dlugosc = txt.size();
}

void odwroc( int & dlugosc, string txt, string & podwr, gpointer dane )
{
    struct struktura * gkp;
    gkp =( struct struktura * ) dane;
   
    int licznik = dlugosc;
    string znak;
    do
    {
       
        cout << txt[ licznik ] << endl << endl;
       
       
        podwr += txt[ licznik ];
        licznik--;
    } while( licznik != - 1 );
   
    cout << "podwr =" << podwr << endl;
    gkp->stx = podwr; //to mi nie działa                 ***
    //gkp->stx = "cos";                     //to działa             ***
   
   
}

void fodw1( string x, gpointer dane )
{
    struct struktura * gkp;
    gkp =( struct struktura * ) dane;
   
    int dlugosc;
   
    string tekst = x;
    string podwr;
    string tst;
   
    sprawdz_dlugosc( dlugosc, tekst );
    odwroc( dlugosc, tekst, podwr, gkp );
   
    //gtk_entry_set_text(GTK_ENTRY(gkp->entout), tekstx.c_str());
}


void pobtxt( GtkWidget * widget, gpointer dane )
{
    struct struktura * gkp;
    gkp =( struct struktura * ) dane;
    const gchar * tekst;
    tekst = gtk_entry_get_text( GTK_ENTRY( gkp->entinp ) );
    cout << tekst << endl;
   
    string txt;
    txt = tekst;
    cout << txt << endl;
    //do odwacania funkcja
    fodw1( txt, gkp );
}

void cpyclp( GtkWidget * w, gpointer dane ) // funkcja kopiująca tekst do schowka
{
   
    struct struktura * gkp;
    gkp =( struct struktura * ) dane;
    cout << "Z=" << gkp->stx << endl;
   
    string a = gkp->stx;
    string x = a;
   
    const char * output = x.c_str();
    const size_t len = strlen( output ) + 1;
    HGLOBAL hMem = GlobalAlloc( GMEM_MOVEABLE, len );
    memcpy( GlobalLock( hMem ), output, len );
    GlobalUnlock( hMem );
    OpenClipboard( 0 );
    EmptyClipboard();
    SetClipboardData( CF_TEXT, hMem );
    CloseClipboard();
   
}

void rysujzmenu( gpointer dane )
{
    struct struktura * gkp;
    gkp =( struct struktura * ) dane;
   
    GtkWidget * mfix;
    mfix = gtk_fixed_new();
    gtk_container_add( GTK_CONTAINER( gkp->sokno ), mfix );
   
    GtkWidget * bodwr;
    bodwr = gtk_button_new_with_label( "Odwróć" );
    gtk_fixed_put( GTK_FIXED( mfix ), bodwr, 10, 60 );
   
    GtkWidget * skp;
    skp = gtk_button_new_with_label( "Skopiuj" );
    gtk_fixed_put( GTK_FIXED( mfix ), skp, 60, 60 );
   
    gkp->entinp = gtk_entry_new();
    gtk_fixed_put( GTK_FIXED( mfix ), gkp->entinp, 10, 30 );
   
    GtkWidget * labwpr;
    labwpr = gtk_label_new( "Podaj tekst do odwrócenia:" );
    gtk_fixed_put( GTK_FIXED( mfix ), labwpr, 10, 10 );
   
    //gkp->entout = gtk_entry_new();
    //gtk_fixed_put(GTK_FIXED(mfix), gkp->entout, 20, 110);
   
    g_signal_connect( G_OBJECT( bodwr ), "clicked", G_CALLBACK( pobtxt ), gkp );
    g_signal_connect( G_OBJECT( skp ), "clicked", G_CALLBACK( cpyclp ), gkp );
   
    gtk_widget_show_all( mfix );
}

int main( int argc, char * argv[] )
{
   
    struct struktura gkp;
   
    gtk_init( & argc, & argv );
    gkp.sokno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_position( GTK_WINDOW( gkp.sokno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( gkp.sokno ), 160, 100 );
    gtk_window_set_title( GTK_WINDOW( gkp.sokno ), "Odwracacz" );
    gtk_container_set_border_width( GTK_CONTAINER( gkp.sokno ), 5 );
    gtk_window_set_opacity( GTK_WINDOW( gkp.sokno ), 1 );
    rysujzmenu( & gkp );
   
    g_signal_connect( G_OBJECT( gkp.sokno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
    gtk_widget_show_all( gkp.sokno );
    gtk_main();
    return 0;
}
P-73537
1 2 3 « 4 » 5
Poprzednia strona Strona 4 z 5 Następna strona