Najnowsze posty na Forum
Z kategorii:
strona 1123...następna »

Tak żyje z dnia na dzień. Wstaje rano a kładę się spać w nocy. Jak w zegarku, dom - praca, praca - dom.

Nie wiem czy to forum ktokolwiek czyta.
Jeśli chodzi o mój pierwszy post to już znalazłem i usunąłem błąd.

Re: Tablica znakowa przez urgourgo, 01 Sep 2007 05:55
Tablica znakowa
urgourgo 31 Aug 2007 18:12
w dyskusji Programowanie / C/C++ » Tablica znakowa

Witam wszystkich !
To mój pierwszy post i od razu wyskakuję z problemem.
Otóż mam funkcję która ma pobierać ścieżkę dostępu do pliku (może być różna i zależy od nazwy użytkownika).
Dla sprawdzenia wyrzucam wynik funkcji (wewnątrz i poza nią) na ekran i niestety wynik jest inny od oczekiwanego.

Mam plik.cc

#include "plik.h"

char ficonf::address[] = "configure";
char ficonf::datafile[] = "data";
char ficonf::cfile[80];
char ficonf::dfile[80];

char * fiop::getaddress(char * file)
{
    char whoami[20];
    char where[80] = "/home/";
    char surfix[] = "/.gkatalog/";
    system("whoami > .gkatalog_user_info.tmp");
    ifstream who(".gkatalog_user_info.tmp");
    who.getline(whoami, 20);
    who.close();
    system("rm .gkatalog_user_info.tmp");
    strcat(where, whoami);
    strcat(where, surfix);
    strcat(where, file);    
    cout << "getaddress: " << where << endl;
    return where;
}

oraz odpowiadający mu plik.h

#include <unistd.h>
#include <iostream>
#include <fstream>
using namespace std;

class fiop
{
public:
    static char * getaddress(char *);
};

class ficonf
{
friend class fiop;    
public:
    static char address[];
    static char datafile[];
    static char cfile[80];
    static char dfile[80];
};

i sprawdzam działanie funkcji:

#include "plik.h"

int main (int argc, char *argv[])
{
    strcpy(ficonf::cfile,fiop::getaddress(ficonf::address));
    strcpy(ficonf::dfile,fiop::getaddress(ficonf::datafile));
    cout << "cfile: "; cout << ficonf::cfile << endl;
    cout << "dfile: "; cout << ficonf::dfile << endl;

    return 0;
}

i wynik mam taki:

getaddress: /home/urgo/.gkatalog/configure
getaddress: /home/urgo/.gkatalog/data
cfile: /home/urgo/.gkatH"����figuy����������������R������0�
dfile: /home/urgo/.gkatalog/data

dlaczego ?

Tablica znakowa przez urgourgo, 31 Aug 2007 18:12

Chodzi o problemem przepełnienia bufora bo jest jedna rzecz, której nie rozumiem. Jak mniemam, cały problem polega na zamazaniu śladu rozkazu call na stosie. Zgadza się? I tu rodzi się pytanie: czym zamazać? Skąd wiadomo, gdzie został umieszczony segment stosu (inaczej - w obecnych systemach wszystkie rejestry segmentowe wskazuja poprzez deskryptory "tą samą" pamięć) - innymi słowy, skąd wiadomo, pod jakim adresem na stosie został przewidziany początek bufora, jeżeli nie jest on znany do momentu uruchomienia programu?

Ustaw wskaźnik na newbie przez AstronomAstronom, 06 Jul 2007 19:53

Znalazłem tylko tyle:
"Większość argumentów startowych ma następującą składnię:

nazwa=[wartość_1][,wartość_2]...[,wartość_11]

gdzie "nazwa" jest unikalnym słowem kluczowym identyfikującym część jądra, do którego odnoszą się podane wartości. Większa ilość argumentów startowych to lista powyższych wywołań oddzielonych od siebie odstępem. Zauważ, że maksymalna ilość wartości to 11. Jądro rzeczywiście rozpoznaje tylko 11 elementów oddzielonych przecinkami przy danym słowie kluczowym. (Chociaż możesz użyć ponownie tego samego słowa kluczowego z dodatkowymi 11 argumentami w jakichś niezwykle skomplikowanych sytuacjach, zakładając, że dane funkcja ustawiająca (patrz niżej) to dopuszcza). Zwróć uwagę na fakt, iż jądro dzieli tę listę na maksimum 10 argumentów typu integer, i następujący po nich łańcuch, więc tak naprawdę nie możesz podać 11 argumentów typu integer o ile nie przerobisz sterownika tak, aby sam sobie zamienił ten 11 element na liczbę typu integer.
Wiekszość sortowania odbywa się w linux/init/main.c. Najpierw jądro sprawdza czy argument jest jednym ze specjalnych argumentów: root=, ro, rw, debug. Znaczenie tych parametrów jest opisane dalej w tym dokumencie.
Następnie sprawdza listę argumentów zawartych w tablicy bootsetups czy podany łańcuch nie został przypisany którejś z funkcji ustawiającej konkretne urządzenie bądź część jądra. Jeśli przekazałeś do jądra linię xxx=3,4,5,6,yyy wtedy jądro przeszukałoby tablicę bootsetups aby zobaczyć czy xxx jest tam wymienione. Jeśli byłoby wymienione wtedy uruchomiłoby funkcję związaną z xxx i przekazałoby jej argumenty typu integer: 3,4,5,6 oraz ostatni łańcuch yyy."

Czy mógłby to ktoś bardziej opisać?

Jak jądro sortuje argumenty przez AstronomAstronom, 06 Jul 2007 19:37
C++ & MySQL
AstronomAstronom 06 Jul 2007 19:10
w dyskusji Bazy danych / MySQL » C++ & MySQL

Znalazłem w necie taki fragment kodu

#include <iostream>
#include <mysql/mysql.h>  // Potrzebny jest nam zainstalowany pakiet libmysqlclient-devel w systemie zawierający bibliotekę mysql.h
#include <string.h> 
using namespace std;

int main()
{

MYSQL* my_sql;                                //reprezentuje połaczenie do bazy danych
MYSQL_RES* res;                              //zmienna reprezentujaca dane odebrane 
MYSQL_ROW   row, end_row;               //zmienne reprezentujaca wersy 

/*II inicjacja polaczenia*/
my_sql=mysql_init(my_sql);
if (my_sql) 
{
   cout << "ok!" << endl;
}
else 
     {
        cout << "!ok!" << mysql_error(my_sql) << endl;
        /*funkcja mysql_error() zwraca wiadomosc o błedzie(ostatnim)*/
        /*funkcja mysql_errno() zwraca kod błędu(ostatniego)*/
      }

/*III połączenie*/
char host[30] = "localhost";        //nazwa serwera do którego chcemy sie podłaczyć
char user[30] = "root";               //uzytkownik którym sie chcemy podłaczyć
char pass[30] = "P@ssw0rd";      // H@sl0 użyskodnika którym sie chcemy podłaczyć
char db[30]   = "test";                //baza do której chcemy sie podłaczyć jesli pusto to
                                                 //podłaczy nas do domyślnej lub zadnej 
                                                 // w sql używamy komendu "use nazwa_bazy;"

if (mysql_real_connect(my_sql, host, user, pass, db, 0, NULL, 0))
{
    cout << "ok!" << endl;
}
else 
{
      cout << "!ok!: " << mysql_error(my_sql) << endl;
}

/*IV*/
long ret;
// select url from tescik limit 1; = wybierz pola "url" z taleli tescik ograniczajac sie do 1 wyniku 
ret = mysql_real_query(my_sql, "select url from tescik limit 1;",strlen("select url from tescik limit 1;"));
if (ret != 0)
 {
               cout<<"!ok!"<< mysql_error(my_sql);
}//if (ret != 0)
else 
{
      cout<<"ok!";
      /*V to co mysql_real_query zostawi po sobie */
     res = mysql_store_result(my_sql); // przypisanie danych pobranych czy coś takiego 
      if (res) 
      {
         unsigned int num_fields;
         num_fields = mysql_num_fields(res); // liczba pol w wersie; 
         while ( (row = mysql_fetch_row(res)) )
         {
            unsigned long *lengths; 
            lengths = mysql_fetch_lengths(res);

            // odbieranie 
            unsigned int i;
            for(i = 0; i < num_fields; i++)
            {
               printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");// wyswietla nr oraz zawartosc 
            }//for(i = 0; i < num_fields; i++)
            printf("\n");
            mysql_free_result(res); // zwalnia pamieć zajeta przez res
         }//while ( (row = mysql_fetch_row(res)) )
      }//if (res)
      else 
           {
               if (mysql_field_count(my_sql) == 0)
                    ret = mysql_affected_rows(my_sql);
               else
                    cout<<"!ok!"<<mysql_error(my_sql);
           }//else if (res)
    }//else if (ret != 0)

    /*VI koniec */
    mysql_close(my_sql);

return 0;
}

Ale nie mogę go odpalić niestety ;(

MySQL odpalony jest:
#mysql —version
mysql Ver 14.12 Distrib 5.0.41, for pc-linux-gnu (i686) using readline 5.1
#/etc/init.d/mysql start
#

Przeglądałem trochę dokumentację z http://dev.mysql.com/doc
Może ktoś wie co i jak się takie połączenia nawiązuje?

C++ & MySQL przez AstronomAstronom, 06 Jul 2007 19:10
#include <cstdlib>
#include <iostream>
using namespace std;

static int wpisy=0;
char autor[30];
char tytul[30];
char isbn[30];
char wyd[30];
char komunikat[30];

int menu();
void wyswietl_menu(int nr);
void dodaj();
void wyswietl_wpis();

int menu()
{
   int wybor;
   do
  {
       cout << "1 - Wyswietl wpisy" << endl;
       cout << "2 - Dodaj nowy wpis" << endl;
       cout << "0 - Wyjdz" << endl;
       cout << "Wybierz: ";
       cin >> wybor;
   }while(wybor> 3 && wybor < 0);
return wybor;
}

void wyswietl_menu(int nr)
{
   switch(nr)
  {
    case 0: return; 
                 break;
    case 1: wyswietl_wpis(); 
                 break;
    case 2: dodaj();
                 break;
    default: 
                 cout<<"brak obslugi"<<endl; 
}
}

void dodaj() 
{
   wpisy++;
   cout << "Podaj tytul ksiazki: ";
   cin.getline(tytul,sizeof(tytul), '\n');
   cout << "Podaj autora :";
   cin.getline(autor,sizeof(autor));
   cout << "Podaj wydanie: ";
   cin.getline(wyd,sizeof(wyd));
   cout << "Podaj nr. ISBN: ";
   cin.getline(isbn,sizeof(isbn)); 
}

void wyswietl_wpis()
{
   cout<<"\nWpis numer: "<<wpisy<<endl;
   cout<<"\nDodano ksiazke pt.\t"<<tytul
          <<"\nautorstwa \t"<<autor
          <<"\n. Adres wydawniczy: \t"<<wyd
          <<"\n; Numer ISBN: \t"<<isbn<<endl;
}

int main()
{
   int nr;
   while(nr=menu())
  {
      wyswietl_menu(nr);
  }
return 0;
}

Popraw sobie tylko lepiej to.

pzdr.

Re: Stringi z klawiatury przez AstronomAstronom, 06 Jul 2007 18:40

zaczynam sie uczyc c++ dopiero

;)

"Naruszenie ochrony pamięci"


dzieki za zaproszenie… imho strona potrzebuje rozglosu, redaktorow, rozglosu, moze innego forum (?), rozglosu i jeszcze raz rozglosu ;)

Re: Stringi z klawiatury przez edpledpl, 06 Jul 2007 11:48

A nie lepiej zrobić jakąś strukturę do tego (lub class) ?

Np. tak:

#include <stdlib.h>
#include <fstream>
#include <iostream> 
#include<string.h> 
using namespace std;
//------------------------------------
struct  TOsoba
{
  string  imie;

};
//------------------------------------
struct TListaOsob 
{
  int n;
  TOsoba lista[100];
};
//------------------------------------
void Pokaz(TListaOsob &l);
void Dodaj(TListaOsob &l);
int MojeMenu();
//------------------------------------
int main(int argc, char **argv)
{
  int odp;
  TListaOsob lista;

  while (odp=MojeMenu())
  {
    switch(odp)
    {

      case 1: Pokaz(lista);
              break;
      case 2: Dodaj(lista);
              break;
    };
  };

  return 0;
}
//------------------------------------
int MojeMenu()
{
int zm;
cout<<endl<<"MENU"<<endl;
cout << "\n0 - Wyjscie";
cout << "\n1 - Pokaz liste";
cout << "\n2 - Dodaj pozycje";

do{
  cin >> zm;
} while (zm<0 || zm>2);
return zm;
}
//----------------------------------
void Pokaz(TListaOsob &l)
{
  int i;

  for (i=0;i<l.n;i++)
  {
    cout<<endl<<"Dodano pozycje:"<<endl;
    cout << (i + 1) << ".   " << l.lista[i].imie   << endl;
   }
}
//------------------------------
void Dodaj(TListaOsob &l)
{
    cout<<"Podaj imie: "; 
    cin >> l.lista[l.n].imie;
    l.n++;

}
//------------------------------------
Re: Stringi z klawiatury przez kriskris, 06 Jul 2007 10:15

http://wklej.org/id/d293374a16

to jest caly kod… zamiana int na void nic nie dala

Re: Stringi z klawiatury przez edpledpl, 06 Jul 2007 08:47

A gdzie twoja struktura lub klasa? Gdzie jest funkcja main() ?

Funkcja dodaj() nie powinna być typu int tylko void.

P.S. Czy ty kompilowałeś to co nam dałeś, czy to tylko część kodu, bo z tego to wynika tyle że powinna być jakaś klasa jeszcze lub structura.

Pzdr.

Re: Stringi z klawiatury przez kriskris, 06 Jul 2007 08:07
#include <iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
int wpisy=0;
string autor[30];
string tytul[30];
string isbn[30];
string wyd[30];
string komunikat;

int dodaj() {
streamsize n;
n=30;
wpisy++;
cout << "Podaj tytul ksiazki: ";
cin.getline(tytul[wpisy], n, "\n");
cout << "Podaj autora :";
cin.getline(autor[wpisy], n, "\n");
cout << "Podaj wydanie: ";
cin.getline(wyd[wpisy], n, "\n");
cout << "Podaj nr. ISBN: ";
cin.getline(isbn[wpisy], n, "\n");
komunikat="Dodano ksiazke pt."+tytul[wpisy]+" autorstwa "+autor[wpisy]+". Adres wydawniczy: "+wyd[wpisy]+"; Numer ISBN: "+isbn[wpisy];
cout << endl << komunikat;
return 0;

a kompilator na to:

ksiazki.cpp: In function 'int dodaj()':
ksiazki.cpp:18: error: no matching function for call to 'std::basic_istream<char, std::char_traits<char> >::getline(std::string&, std::streamsize&, const char [2])'
/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../include/c++/4.2.0/istream:605: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../include/c++/4.2.0/istream:417: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]
ksiazki.cpp:20: error: no matching function for call to 'std::basic_istream<char, std::char_traits<char> >::getline(std::string&, std::streamsize&, const char [2])'
/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../include/c++/4.2.0/istream:605: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../include/c++/4.2.0/istream:417: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]
ksiazki.cpp:22: error: no matching function for call to 'std::basic_istream<char, std::char_traits<char> >::getline(std::string&, std::streamsize&, const char [2])'
/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../include/c++/4.2.0/istream:605: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../include/c++/4.2.0/istream:417: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]
ksiazki.cpp:24: error: no matching function for call to 'std::basic_istream<char, std::char_traits<char> >::getline(std::string&, std::streamsize&, const char [2])'
/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../include/c++/4.2.0/istream:605: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../../include/c++/4.2.0/istream:417: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istrea
Re: Stringi z klawiatury przez edpledpl, 06 Jul 2007 07:09

Cześć, witaj na wiki

Mam pytanie dlaczego funkcja dodaj jest typu int a nie void ?

Tutaj masz przykładowe źródło programiku, jak wczytać dłuższego stringa (może Ci się przyda).

#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
 
int main(int argc, char* argv[])
{
        char napis[128];
        int i=0;
        char c;
 
        cout<<"Podaj stringa ze spacjami: ";
 
        cin.get(c);
        while (  c != '\n' ){
            napis[i]=c;
            i++;
            cin.get(c);
        }
 
        napis[i]=0;
 
        cout << napis;
 
 return 0;
}
Re: Stringi z klawiatury przez kriskris, 06 Jul 2007 05:55

Jeżeli używasz strumienia cin to on wczytuje do białego znaku. Białe znaki są pomijane. Jeżeli koniecznie chcesz używać cin to podawaj tekst w takiej postaci: "Tekst w cudzysłowie"
Jak chcesz, żeby wczytywał ci całą linie do znaku nowej linii to używaj getline.
Jak będziesz miał problemy to zapodaj cały kod.

Re: Stringi z klawiatury przez NowicjuszNowicjusz, 05 Jul 2007 20:24
int dodaj() {
wpisy++;
cout << "Podaj tytul ksiazki: ";
cin >> tytul[wpisy];
cout << "Podaj autora :";
cin >> autor[wpisy];
cout << "Podaj wydanie: ";
cin >> wyd[wpisy];
cout << "Podaj nr. ISBN: ";
cin >> isbn[wpisy];
komunikat= "Dodano ksiazke pt."tytul[wpisy]" autorstwa "autor[wpisy]". Adres wydawniczy: "wyd[wpisy]"; Numer ISBN: "isbn[wpisy];
cout << endl << komunikat;
return 0;
}

Witam, zacznam sie uczyc c++ dopiero. dlaczego jesli wpisze tytul ksiazki dwuwyrazowy, drugi wyraz automatycznie przeskakuje jako autor? probowalem uzyc wstring ale wogole nie chcialo sie skompilowac.

Stringi z klawiatury przez edpledpl, 05 Jul 2007 16:49

Kompilacja programiku poprzez g++ kernel.cpp -o kernel

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/list.h>
#include<stdio.h>

int main()
{

 return 0;
}

napotyka na takie błędy:

# g++ kernel.cpp -o kernel
In file included from /usr/include/linux/module.h:11,
                 from kernel.cpp:2:
/usr/include/linux/list.h:887:2: warning: #warning "don't include kernel headers in userspace"
/usr/include/linux/module.h:49: error: field 'attr' has incomplete type
/usr/include/linux/module.h:50: error: expected identifier before '*' token
/usr/include/linux/module.h:50: error: 'ssize_t' declared as function returning a function
/usr/include/linux/module.h:51: error: expected identifier before '*' token
/usr/include/linux/module.h:52: error: 'ssize_t' declared as function returning a function
/usr/include/linux/module.h:52: error: 'int module_attribute::ssize_t(int*)' cannot be overloaded
/usr/include/linux/module.h:50: error: with 'int module_attribute::ssize_t(int*)'
/usr/include/linux/module.h:60: error: field 'kobj' has incomplete type

A na innym kompie trochę mniej błędów:

# g++ kernel.cpp -o kernel
In file included from /usr/include/linux/module.h:11,
                 from kernel.cpp:1:
/usr/include/linux/list.h:887:2: warning: #warning "don't include kernel headers in userspace"
/usr/include/linux/module.h:49: error: field ‘attr’ has incomplete type
/usr/include/linux/module.h:60: error: field ‘kobj’ has incomplete type

Tutaj znalazłem coś podobnego: http://forum.linux-sevenler.org/index.php?topic=7187.msg34060

Pliki nagłówkowe module.h oraz list.h znajdują się w /usr/include/linux a mimo to kompilator napotyka jakieś błędy. Czy wie ktoś jak sobie z tym poradzić?

#include<linux/module.h> przez kriskris, 29 Jun 2007 21:00

Ruszy ruszy, aby tylko było więcej chętnych do redagowania

Re: Śmierć stronki przez kriskris, 18 Jun 2007 20:20

Szkoda że stronka umarła fajnie się zapowiadało :(

Wszystkich zawiedzionych zapraszam na moją stronkę o nieco innej tematyce (bo o programowaniu jądra Linuksa) ale z aktywną społecznością. Mile widział bym też chętnych do pomocy.Link:
http://kernel.wikidot.com

P.S. Mam nadzieję że stronka jednak ruszy :)

Śmierć stronki przez przemo_liprzemo_li, 29 Apr 2007 19:17
strona 1123...następna »