Изменение переменной там где это не должно быть
От: SmokerMan  
Дата: 16.10.04 12:11
Оценка:
if( (outstream = fopen( OutFileName, "wb" )) != NULL )
{MessageBox(NULL, OutFileName, NULL, MB_OK);

for (i= ThirdBoundaryStringNum +5; i < ForthBoundaryStringNum-1; i++)
{

Temp1 = Letter[i].Left(Letter[i].GetLength() — 1);
//fwrite ((LPCTSTR)Temp1, 1, Temp1.GetLength(), outstream1);

unsigned char buff[4];
CString tempstr;

while ( Temp1.Left(4).GetLength()!=0)
{
for (int j=0; j<4; j++)
{
buff[j] = Temp1[0];
Temp1.Delete(0,1);
}
fprintf(outstream,"%c",b(buff[0])<<2 | b(buff[1])>>4 & 0x3 );
isEnd(buff[2])
fprintf(outstream,"%c",b(buff[1])<<4 | b(buff[2])>>2 & 0xF);
isEnd(buff[3])
fprintf(outstream,"%c",b(buff[2])<<6 | b(buff[3]) & 0x3F);
}

}


}
fclose(outstream);

MessageBox(NULL, OutFileName, NULL, MB_OK);


Где то в этом куске кода меняется OutFileName — первый раз MessageBox выводит то, что я предполагаю, а во второй раз какие-то непонятные символы. Чтобы это моглдо быть, и как от этого избавиться?
Re: Изменение переменной там где это не должно быть
От: Shady Россия  
Дата: 16.10.04 12:19
Оценка:
Здравствуйте, SmokerMan, Вы писали:

SM>if( (outstream = fopen( OutFileName, "wb" )) != NULL )

SM> {MessageBox(NULL, OutFileName, NULL, MB_OK);

SM> for (i= ThirdBoundaryStringNum +5; i < ForthBoundaryStringNum-1; i++)

SM> {

SM> Temp1 = Letter[i].Left(Letter[i].GetLength() — 1);

SM> //fwrite ((LPCTSTR)Temp1, 1, Temp1.GetLength(), outstream1);

SM> unsigned char buff[4];

SM> CString tempstr;

SM> while ( Temp1.Left(4).GetLength()!=0)

SM> {
SM> for (int j=0; j<4; j++)
SM> {
SM> buff[j] = Temp1[0];
SM> Temp1.Delete(0,1);
SM> }
SM> fprintf(outstream,"%c",b(buff[0])<<2 | b(buff[1])>>4 & 0x3 );
SM> isEnd(buff[2])
SM> fprintf(outstream,"%c",b(buff[1])<<4 | b(buff[2])>>2 & 0xF);
SM> isEnd(buff[3])
SM> fprintf(outstream,"%c",b(buff[2])<<6 | b(buff[3]) & 0x3F);
SM> }

SM> }



SM> }

SM> fclose(outstream);

SM> MessageBox(NULL, OutFileName, NULL, MB_OK);



SM>Где то в этом куске кода меняется OutFileName — первый раз MessageBox выводит то, что я предполагаю, а во второй раз какие-то непонятные символы. Чтобы это моглдо быть, и как от этого избавиться?

Ну во первых — пожалуйста обводи свой код тегом [code] — ну не железный я
Ну во вторых — нигде он тут у тебя не меняется, негде просто меняться! Может херит параллельный поток, а так всё впорядке. Приведи полный листинг.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Re[2]: Изменение переменной там где это не должно быть
От: SmokerMan  
Дата: 16.10.04 12:43
Оценка:
S>Ну во первых — пожалуйста обводи свой код тегом [code] — ну не железный я
S>Ну во вторых — нигде он тут у тебя не меняется, негде просто меняться! Может херит параллельный поток, а так всё впорядке. Приведи полный листинг.


Замечание учту. А вот поток у мен один, правда этот код компилится в DLL. может эта переменная где то в памяти меняется? хотя я напрямую в память я ничего не пишу и эта перемнная больше нигде не используется.. Есть ещё идеи?
Re: Изменение переменной там где это не должно быть
От: Олег Гашев
Дата: 16.10.04 12:44
Оценка:
Здравствуйте, SmokerMan, Вы писали:

SM>Где то в этом куске кода меняется OutFileName — первый раз MessageBox выводит то, что я предполагаю, а во второй раз какие-то непонятные символы. Чтобы это моглдо быть, и как от этого избавиться?


OutFileName сделай const и посмотри где оно меняется, из кода непонятно. И что такое Temp1.
Либо я найду путь, либо проложу его. © Свифт
Re[3]: Изменение переменной там где это не должно быть
От: Shady Россия  
Дата: 16.10.04 12:47
Оценка:
Здравствуйте, SmokerMan, Вы писали:

SM>Замечание учту. А вот поток у мен один, правда этот код компилится в DLL. может эта переменная где то в памяти меняется? хотя я напрямую в память я ничего не пишу и эта перемнная больше нигде не используется.. Есть ещё идеи?

У тебя может где-то массив вылезать за пределы и херить твою строку. Массивы используешь? Если да, преведи все операции с массивами до объявления своей строки.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Re[4]: Изменение переменной там где это не должно быть
От: SmokerMan  
Дата: 16.10.04 14:28
Оценка:
Temp1 = Letter[i].Left(Letter[i].GetLength() - 1);

— эта строка и меняет OutFileName, но как Letter — вектор CString'ов?

проблему решил через LockBuffer и UnlockBuffer, но ведь это не правильно.
Re[5]: Изменение переменной там где это не должно быть
От: Shady Россия  
Дата: 16.10.04 14:31
Оценка:
Здравствуйте, SmokerMan, Вы писали:

SM>
Temp1 = Letter[i].Left(Letter[i].GetLength() - 1);

SM> — эта строка и меняет OutFileName, но как Letter — вектор CString'ов?

SM>проблему решил через LockBuffer и UnlockBuffer, но ведь это не правильно.

Программа большая? Приведи листинг (если конечно не коммерческая тайна), просто тот кусок, что ты дал, и что ты написал, туман не развеяли...
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Re[6]: Изменение переменной там где это не должно быть
От: SmokerMan  
Дата: 16.10.04 14:54
Оценка:
LPCSTR GetAttach(LPSTR FileName)
{    
    MSG_MULTIPART = false;
    //n?eouaaai oaee n ienuiim a aooa?
    FILE *stream = NULL;
    STRINGVECTOR Letter;
    char TempStr[150];
    int iterator=0;
    if( (stream = fopen( FileName, "rt" )) != NULL  )
    {
       while (!feof(stream)) 
        {
                   if(fgets(TempStr, 150, stream)==NULL)
            {
                            break;
            }
            Letter.push_back(TempStr);
        memset(TempStr, NULL, 150);
        iterator++;
        }
    }
    fclose(stream);

    const int StringNum = iterator;
    LPCTSTR BoundaryStr = "boundary=\"";
    int i =0;
    int FirstSim;
    int FirstBoundaryStringNum = 0;

    for ( i =0; i < iterator; i++)
     {
         if ((FirstSim = Letter[i].Find(BoundaryStr)) != -1)
         {
         FirstBoundaryStringNum = i;
         break;
         }
            
     }
     if (FirstBoundaryStringNum != 0)
     {
     MSG_MULTIPART = true;
     }
     if (!MSG_MULTIPART)
     {
     char *log_mes = "no attached files in the letter";
     WriteLog(log_mes);
         return "ERROR";
     }
     CString BoundaryCode;
     CString temp = Letter.operator [](i).Right(Letter.operator [](i).GetLength() - FirstSim - 10);
     BoundaryCode = temp.Left(temp.GetLength() - 2);
     CString BoundaryPrefix = "--";
     CString BoundaryFull = BoundaryPrefix + BoundaryCode;
     int ThirdBoundaryStringNum =0;
     int ForthBoundaryStringNum =0;
         int MeetBound = 0;
     for ( i = FirstBoundaryStringNum+1; i < StringNum; i++)
     {
     if((Letter[i].Find((LPCTSTR)BoundaryFull) != -1))
         {
             MeetBound++;
              if (MeetBound == 2)
        {
                ThirdBoundaryStringNum = i;
        }
         if (MeetBound == 3)
        {    
        ForthBoundaryStringNum = i;
        break;
        }    
        }
        }
        FILE *outstream;
        srand( (unsigned)time( NULL ) );
        char temp_rand[6];
        _itoa(rand(), temp_rand, 10);
        CString TempFolder = temp_rand;
        TempFolder = "e:\\ctb_server\\" + TempFolder;
        if (_mkdir(TempFolder) == -1)
        {
            WriteLog("cannot create temprorary folder");
            return "ERROR";
        } 

        int temp_search = Letter[ThirdBoundaryStringNum + 3].Find('"');
        int temp_search1 = Letter[ThirdBoundaryStringNum + 3].ReverseFind('"');
        CString ExtractedFileName = Letter[ThirdBoundaryStringNum + 3].Mid(
                                    temp_search+1,
                                     temp_search1
                                     -temp_search
                                     -1);

        
        const LPCSTR OutFileName = (LPCTSTR) (CString(TempFolder) +CString("\\") + CString(ExtractedFileName));
        CString name(OutFileName);
        MessageBox(NULL, "schas bydet outfilename", NULL, MB_OK);
        CString EncodedFile;
        CString DecodedFile, TempFile, Temp1;
         if( (outstream = fopen( OutFileName, "wb" )) != NULL  )
         {MessageBox(NULL, OutFileName, NULL, MB_OK);
         name.LockBuffer();
             
        for (i= ThirdBoundaryStringNum +5; i < ForthBoundaryStringNum-1; i++)
        {
    
        Temp1 = Letter[i].Left(Letter[i].GetLength() - 1);/*вот это строка как показал дебаггер и меняет OutFileName, но как?*/
            unsigned char buff[4];
            CString tempstr;
              while ( Temp1.Left(4).GetLength()!=0) 
              {
                    for (int j=0; j<4; j++)
                    {
                    buff[j] =  Temp1[0];
                    Temp1.Delete(0,1);
                    }
                fprintf(outstream,"%c",b(buff[0])<<2   | b(buff[1])>>4 & 0x3 );
                isEnd(buff[2])
                fprintf(outstream,"%c",b(buff[1])<<4 | b(buff[2])>>2 & 0xF);
                isEnd(buff[3])
                fprintf(outstream,"%c",b(buff[2])<<6 | b(buff[3]) & 0x3F);
              }
                    }
     }    
         name.UnlockBuffer();/*UnlockBuffer и LockBuffer решили проблему но ведь это неправильно*/
         MessageBox(NULL, name, NULL, MB_OK);
             fclose(outstream);
        return name;
}

Вот весь код функции, кто скажет как это исправить?
Re[7]: Изменение переменной там где это не должно быть
От: WolfHound  
Дата: 16.10.04 19:39
Оценка: :)
Здравствуйте, SmokerMan, Вы писали:

Остальной код не смотрел... но это шедевр...
SM>
SM>        const LPCSTR OutFileName = (LPCTSTR) (CString(TempFolder) +CString("\\") + CString(ExtractedFileName));
SM>

Тут создается временный объект потом ты получаешь указатель на внутренный буфер этого объекта. После чего объект разрушается. А то что ты упел воспользоваться этой строкой то это просто несчастный случай.
... << RSDN@Home 1.1.4 rev. 185 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Изменение переменной там где это не должно быть
От: Shady Россия  
Дата: 16.10.04 19:44
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Тут создается временный объект потом ты получаешь указатель на внутренный буфер этого объекта. После чего объект разрушается. А то что ты упел воспользоваться этой строкой то это просто несчастный случай.

Соответственно страности объясняются тем, что когда первый раз выводиться мессадж бокс память, на которую указатель указывает не затерается (везет), а потом она элементарно перезаписывается
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.