LINUX.ORG.RU

stl


0

0

Люди, чего-то я непонимаю ...
Есть код на с++ с использованием stl, и в винде и в линухе компилится без проблем, но в линухе через раз падает в сегфаулт, а в винде идет без проблем, в связи с этим вопрос нужно ли в линуксе как-то по особому подклюяать стл, кроме как using namespace std; ?
Вот выдержки из кода

<main.cpp>
#include <stdlib.h>

#include "ext.h"
#include "cvalue.h"

int main(int argc, char argv[])
{
CValue v1, v2, v;

string s;

s="102";
v1=s;
s="156";
v2=s;
v=v1+v2;
v.Get(s);
cout<<s<<endl;
return EXIT_SUCCESS;
}

<ext.h>
#include <vector>
#include <string>
#include <stack>
#include <iostream>
#include <fstream>
#include <functional>
#include <algorithm>
#include <stdlib.h>

using namespace std;

struct TListItem
{
string Value;
bool IsOperator;
};
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef vector <TListItem> TList;
typedef vector <ushort> TData;


<cvalue.h>
class CValue
{
private:
TData Data;
public:
void Get(string & V);
void GetData(TData & V);

CValue & operator = (string & V);
CValue & operator = (TData & V);

CValue & operator + (CValue & V);
}

<cvalue.cpp>
#include "ext.h"
#include "cvalue.h"

void CValue::Get(string & V)
{
char tmp[1];
string res="";

for (TData::iterator i=Data.begin(); i<Data.end(); i++)
{
sprintf(tmp, "%d", i);
cout<<"sadfsa"<<endl;
res.append(tmp);
}
reverse(res.begin(), res.end());
V=res;
};
void CValue::GetData(TData & V)
{
for (TData::iterator i=Data.begin(); i<Data.end(); i++)
V.push_back(*i);
};
CValue & CValue::operator = (string & V)
{
char tmp[1];
Data.clear();
for (int i=0; i<V.length(); i++)
{
tmp[0]=V[i];
tmp[1]='\0';
Data.push_back(atoi(tmp));
}
reverse(Data.begin(), Data.end());
return *this;
};
CValue & CValue::operator = (TData & V)
{
Data.clear();
for (TData::iterator i=V.begin(); i<V.end(); i++)
Data.push_back(*i);
return *this;
};

CValue & CValue::operator + (CValue & V)
{
CValue * res=new CValue;
TData s1;
GetData(s1);
TData s2;
V.GetData(s2);
TData s;
ushort v1, v2, v;
ushort ostatok=0;
char tmp[2];

int i;

if (s1.size()<s2.size())
while (s1.size()<s2.size())
s1.push_back(0);
else
while (s2.size()<s1.size())
s2.push_back(0);

for (i=0; i<s1.size(); i++)
{
v1=s1[i];
v2=s2[i];
v=v1+v2+ostatok;

if (v>9)
ostatok=1;
else
ostatok=0;
s.push_back(v-ostatok*10);
};
if (ostatok==1) s.push_back(1);
*res=s;
return *res;
};

anonymous

Ответ: по-особенному подключать не нужно.
Замечания:
=========
Мне интересно, что ты добиваешься в операторе "sprintf(tmp, "%d", i)"
метода "CValue::Get(string & V)"?
Откуда такая уверенность, что одного байта в "char tmp[1]" будет
достаточно?
Я бы не стал писать "i < Data.end()", а написал бы "i != Data.end()".
И так далее. Это первое, на что я обратил внимание в постинге.
Советы:
1. Почитать учебники по С, раз уж пользуешься C-библиотекой;
2. Почитать учебники по C++;
3. Почитать учебники по STL.

sergio_nsk
()

Спасибо sergio_nsk! Действительно вся проблема заключалась в том, что для tmp нужно было 2 байта (и не только в этой функции), а в строчке sprintf(tmp, "%d", i) это очепятка, на самом деле она выглядит sprintf(tmp, "%d", *i).
> Советы:
> 1. Почитать учебники по С, раз уж пользуешься C-библиотекой;
> 2. Почитать учебники по C++;
> 3. Почитать учебники по STL.
Так я и учу:) И никак нимогу дописать курсовую работу ... решил вые#нуца и написать все в линуксе.

anonymous
()
Ответ на: комментарий от anonymous

Раз уж ты такой вежливый, то тогда еще совет, если не против: tmp[2] тоже мало. Раз уж ты выводишь unsigned short, то как минимум готовь массив из 5 байтов (max unsigned int = 65535 -- это 5 цифр) плюс 1 байт для нуля. Итого, как минимум tmp[6]. Может ты и знаешь, что у тебя числа < 10, но, кто знает, может ты захочешь расширить функциональность для чисел >= 9, и если сейчас это не предусмотреть, то в последствии будет очень трудно отлавливать ошибки в казалось бы "раньше работающей" библиотеке. И не думай, что этот код только на сегодня, нужно всегда писать правильно -- так вырабатывается профессионализм. Советую тебе все это, как специалист в обасти верификации программ.

sergio_nsk
()
Ответ на: комментарий от anonymous

Раз уж ты такой вежливый, то тогда еще совет, если не против: tmp[2] тоже мало. Раз уж ты выводишь unsigned short, то как минимум готовь массив из 5 байтов (max unsigned int = 65535 -- это 5 цифр) плюс 1 байт для нуля. Итого, как минимум tmp[6]. Может ты и знаешь, что у тебя числа < 10, но, кто знает, может ты захочешь расширить функциональность для чисел >= 10, и если сейчас это не предусмотреть, то в последствии будет очень трудно отлавливать ошибки в казалось бы "раньше работающей" библиотеке. И не думай, что этот код только на сегодня, нужно всегда писать правильно -- так вырабатывается профессионализм. Советую тебе все это, как специалист в обасти верификации программ.

sergio_nsk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.