윈도우에서 구현한 코드가 우분투에서 안되는....

jswoo21의 이미지

구현한 프로그램이..
텍스트 파일에서 데이터 읽어와서
파싱한 뒤에 알맞은 구조체에 저장하고
여러 자료구조들(2d 링크드리스트, min heap, max heap, tree 등)의 노드들이 위에서 만든 구조체들을 포인터로 가지고 있고 알맞은 출력을 해주는 식인데요..
비주얼 스튜디오로 구현한뒤 테스트 해보면
에러 하나없이 깔끔하게 아웃풋 파일이 나오는데요..
같은 코드 리눅스로 옮겨서 테스트해보니..
에러는 안나는데 아웃풋이 안나오더라구요...

왜그런가 출력으로 일일히 데이터 찍어봤는데
텍스트파일에서 파싱할 때 제대로 파싱이 되고
그 데이터들을 구조체에 저장도 제대로 됬는데
그래프에 구조체가 들어간 뒤에
그래프에서 출력하면 데이터가 깨지더라구요...
뭔가 문제가있는거같은데..
이거왜이럴까요?ㅜㅜㅜㅜㅜ

snowall의 이미지

의도적으로 수수께끼를 내신게 아니라면 어떤 언어로 만들었는지, 컴파일러는 어떤걸 썼는지 등등을 알려주셔야 답이 달릴 것 같네요.

아니면 코드를 올리거나...

피할 수 있을때 즐겨라! http://melotopia.net/b

jswoo21의 이미지

c++로 짯구요...
코드가 좀 길어서...
헤더파일이 13개라..

typedef struct A
{
data들...
Node1 *pointer;
}A;

이런 구조체에 파일에서 데이터 읽어서 저장시킨다음에
2d 링크드리스트에서

class Node1
{
char name[10];
Node1 *pdown;
Node2 *pnext;
}

class Node2
{
Node2 *pnext;
A *data;
}

이런 노드들이 있는데요
Node1이 아래로 쭉 연결되있고
각 Node1들이 각각 Node2들을 가리키고
그 Node2들은 위의 구조체를 가리킬때
구조체는 다시 특정 Node1을 가리키는 형태로 구현했는데요..
링크드리스트에서 탐색하면서
구조체가 가리키는 Node1의 이름을 출력시킬때
출력이 안되더라구요..
이부분이 문제가있는데..
윈도우에선 정상적으로 출력되는데..
리눅스에선 왜안되는지..
에러도안뜨고..ㅜ

혹시 리눅스에서 strcmp쓸때 문제있나요?
저부분에서 strcmp가 쓰이는데..
그부분이 좀 맘에 걸리는데..

qiiiiiiiip의 이미지

( 게시판에 글을 올리는 것이,
이 문제가 어려운 문제이다 또는 나도 노력할만큼 했다라는 것을
스스로에게 합리화 시키는 것이 목적이 아니라,
진정으로 문제의 해결 방법을 찾고자 하는 것이라면.. )

1. 에러가 재현되는 minimal code를 찾아서,
2. 해당 코드를 올려주세요..

대부분의 문제가 1의 과정에서 해결이 됩니다.
그런데 대부분의 질문자들은 귀찮다는 이유로 1의 과정을 하지 않는 것이 문제..

--

앞부분 괄호의 내용은 사족 ( 사족이 아니라 사두인가요.. ) 입니다만,
이렇게 질문하면서 진짜 답을 얻으려고 하는것이가 라는 궁금증이 드는 글들이 제법 있어서 붙여봅니다.

jswoo21의 이미지

typedef struct City
{
char name[10];
} City;

typedef struct Connect
{
City *pCity1;
City *pCity2;
int cost;
int count;
}Connect;

template
class ListNode
{
friend class Graph;
friend class MST;
friend class Planner;
public:
ListNode *pNext;
T *data;
ListNode() {data=NULL;pNext=NULL;};
};

typedef ListNode ConListNode;

class CityListNode : public ListNode
{
private:
bool visit;
ConListNode *pCon;
CityListNode *pNext;
public:
CityListNode() {pCon=NULL;pNext=NULL;visit=false;};
};

위의 ConListNode가 Connect라는 구조체를 가리키고 있고
CityListNode가 City라는 구조체를 가리키고 있습니다.
위 두 Node들로 2D LinkedList를 구성했구요..
CityListNode -> ConListNode
CityListNode -> ConListNode
CityListNode -> ConListNode
이런식으로요...

이때 Connect 구조체에 보면 City구조체를 가리키는데요
그 City 구조체들을 CityListNode가 가리키는 상태구요

먼저 리스트를 구성할때
City구조체에 데이터를 저장한뒤
CityListNode를 생성해 위 구조체를 가르킨뒤
리스트에 삽입했고
Connect 구조체의 City 구조체는
리스트의 함수를 통해 그 주소값을 찾아 Connect에 저장하는 방식으로 했습니다.

void Planner::MakeGraph()
{
City *city;
Connect *con;

// insert city
while(1)
{
city=f->ParseCity(); // city의 데이터를 저장해 city를 반환해줌
if(!city)
break;
g->InsCity(city);
}

cout< g->PrintCity();
cout<

// insert connect
while(1)
{
con=f->ParseConnect(g); // connect의 데이터를 저장해 connect를 반환해줌
if(!con)
break;
g->InsCon(con);
}
cout< g->PrintCity();
cout< }

이때 위의 ParseConnect()함수 내에 특정 데이터를 갖는 City의 포인터를 반환해주는 함수가 있는데

City *Graph::Search(char *name)
{
CityListNode *c=pRoot;

while(c)
{
if(!strcmp(c->data->name,name))
{
cout<<"[Graph.h] Found - "<data->name< return c->data;
}
c=c->pNext;
}

return NULL;
}

확인해보니 위에서 strcmp로 확인한 뒤 문제가 발생되는것으로 보여집니다..

출력문 [Graph.h] Found - 까지만 출력되고
c->data->name이 출력되지 않고 종료되더군요..
이럴때
어떤부분을 확인해봐야할까요?

jswoo21의 이미지

다시 확인해보니 strcmp가 제대로 수행이 안되네요...
혹시 리눅스에서 strcmp쓸때 윈도우랑 다른점이 있나요?

qiiiiiiiip의 이미지

아니오

--

여전히 에러는 님이 보여주지 않은 코드 어딘가에 있습니다.
님이 처음 올리신 글로 strcmp에서 문제가 있을 것이다라는 것을
알아차릴 사람이 있었을까요?

에러가 재현가능한 minimal code란,

누구나

copy&paste 해서 파일로 저장하고,
copy&paste해서 컴파일하고,
copy&paste해서 실행했을때

동일한 에러가 나는 코드를 의미합니다.

--

윈도에서는 되는 코드가 리눅스에서는 안된다면,
그것이 말씀하신 strcmp 코드 부분과 관련된 것이라면,
버퍼의 초기화 관련 문제일 가능성이 높습니다.

romandev의 이미지

strcmp는 c표준 라이브러리에 포함되기 때문에 구현이 다를지라도 입력과 출력은 동일해야만 합니다.

그러므로 strcmp가 기대하는바와 다르게 수행된다면 비교하는 두 데이터를 디버거나 혹은 출력문을 통하여 확인을 먼저 해보시는게 좋아보입니다.

또한 리눅스와 윈도우에서 텍스트 줄바꿈 문자의 처리방식이 약간 상이한 부분이 있어서 파일을 읽어서 작성하신 자료 구조에 올리는 과정에서 데이터가 틀어졌을 가능성도 배제할 순 없을 것 같습니다.

익명 사용자의 이미지

1. 먼저 국어 공부를 좀 하세요. 글쓰기를 공부하고 연습하실 것을 강력하게 권합니다.

2. C++과 C를 섞어쓰지 마세요. 그냥 C++만 쓰시면 됩니다.

typedef struct City ... 이런 거는 C입니다. 문자열을 처리하기 위해 char 배열을 사용하는 것도 C이구요.
C++ 방식으로 struct 를 사용하시고, 문자열은 std::string 을 사용하세요.

3. strcmp는 C 표준 함수입니다. 정확하게 사용했다면 visual C 와 gcc 에서 똑같이 작동합니다.

strcmp에서 문제가 발생한다고 생각하시면 그 부분만 테스트해보세요.
qiiiiiiiip 님이 이미 말씀하셨듯이 문제를 재현하는 ""최소한""의 코드를 작성해서 테스트해보시면 그 과정에서 해결될 가능성이 큽니다.

익명 사용자의 이미지

몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅
몸챗무료화상채팅 ★화상채팅 ▶ 5353 . OA .TO ◀ 성인화상채팅

february28의 이미지

1.동일한 소스내용이 되어졌는지..
2.os외에 동일한 환경인지 ( 파일입출력환경또는 키보드나터미널입출력환경 또는 문자열집합(아스키든지 utf8이든지)환경등의 동일한것인지
3.빌드스크립트가 동일한지..
4.런타임시에 다른 가감된 내용이나 처리는 없는지..

아무튼 c/c++ 언젠간 ..져야합니다...

--------------------------------------------------------------------------------
open source, open teaching, 천기누설이 꿈~ 은 개뿔...
--------------------------------------------------------------------------------

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.