Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Почему последней строкой выводиться 1?
    Код (Text):
    1.         long int     one;
    2.         long int     two;
    3.         one=5;
    4.         two=8;
    5.         cout<<"One = "<<one<<"\t";
    6.         cout<<"Address of one: "<<&one<<endl;
    7.         cout<<"Two = "<<two<<"\t";
    8.         cout<<"Address of two: "<<&two<<endl;
    9.         cout<<&one-&two;
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    все верно. разница между ними ровно один long int.
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    уважаемый n0name, ответьте пожалуйста на пост #299. душа хочет ответа!
    спасибо большое.
     
  4. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    n0name
    Получить разницу не в колличестве переменных а в количестве байтов?
     
  5. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Keva
    переменные one и two имеют одинаковый тип, поэтому результат трёх операций с этими переменными приводится к этому типу

    когда к массиву по индексу обращаетесь, получаете не набор байтов, а значение определенного типа
     
  6. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Объявляю массив символов и отображаю его на экране следующим образом:
    Код (Text):
    1. char Array[4]="test";
    2. cout<<Array;
    На экране появляется "test" и еще три какие то символа, это 0D и 0A?
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Keva
    Скорее, мусор. Объяви массив размером в 5 байт, чтобы строка заканчивалась нулём.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    (&one-&two) * sizeof(one)
    varnie
    дык ты же все правильно понял, гораздо лучше сравнивать одинаковые типы данных, либо вручную приводить к таким, иначе может получится некорректный результат, как у тебя в примере.
     
  9. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    n0name,
    да, я так и понял. ну, зато теперь я спокоен что все верно. спасибо за пояснение еще раз!
     
  10. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    что значит двойной указатель? Например следующее объявление:
    Код (Text):
    1. unsigned char **buffer;
     
  11. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    указатель на массив или двухмерный массив...
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    что угодно может означать. хоть массив указателей, хоть указатель на массив, хоть просто сам по себе указатель на указатель на байт.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Keva
    да можно написать хоть unsigned char********* buffer;

    А unsigned char** buffer означает буквально - указатель на массив указателей или массив из указателей на массивы, то есть двухмерный массив, организованный следующим образом:

    +------------+
    | uchar* | -> [ uchar | uchar | uchar | uchar | uchar | uchar | ... | uchar ]
    +------------+
    | uchar* | -> [ uchar | uchar | uchar | uchar | uchar | uchar | ... | uchar ]
    +------------+
    ....
    +------------+
    | uchar* | -> [ uchar | uchar | uchar | uchar | uchar | uchar | ... | uchar ]
    +------------+

    То есть массив указателей, каждый из которых указывает на одномерный массив.
    Просто бывают еще и другие двухмерные массивы, когда в памяти тупо идут все строчки одна за одной.
    Объявляется например так:
    unsigned char array[10][20];
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Не согласен. Означает буквально именно "указатель на указатель на unsigned char". Остальное - предположения :)
     
  15. yak

    yak New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2007
    Сообщения:
    9
    Код (Text):
    1. Linking...
    2. xxxxx.obj : error LNK2001: unresolved external symbol __imp__InternetOpenA@20
    3. Release/xxxxx.exe : fatal error LNK1120: 1 unresolved externals
    4. Error executing link.exe.
    никто не знает, что за баг такой в VC++6.0 ? вылезает на всех на ф-циях wininet, причем через раз, то есть то нет....
     
  16. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Это баг в голове, а не в VC++6.0.
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    добавь в сорец #pragma comment(lib, wininet.lib)
     
  18. Wert

    Wert New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2007
    Сообщения:
    4
    Добрый время_суток, уважаемые форумчане!
    Не так давно начал изучать С++. Сейчас пишу свой первый проект.
    Сначала кратко о том что это будет, дабы избежать лишних вопросов.
    это достаточно простой код для вычисления определителя квадратных матриц.
    Работает следующим образом: Создается динамический список матриц (обьявлен класс матриц с интегрированным указателем на следующий элемент) попроходно этот список упрощается вплоть до получения матрицы 1х1,чей определитель и есть этот элемент.
    Упрощение происходить так: хватаем первую попавшуюся матрицу NxN из динамического списка и разлагаем ее на N матриц (N-1)x(N-1) ; из этих N матриц получаем динамический список поменьше , который вставляем на место первоначальной матрицы . и т.д

    Теперь собственно проблема: в функции упрощения ни в какую не получается создать новый указатель на матрицу и инициализировать его. Все прекрасно компилится,но вываливается ошибко в винде.
    Работает только в случае когда матрица инициализируется единичками. Подскажите, в чем может быть трабл? в main все прекрасно создается.
    Весь код прикреплен. Процедура в main.cpp называется DowngradeLevel
    C++Builder X.
    ЗЫ: заодно можно и нужно указывать на остальные ошибки; любая критика приветствуется.

    main.cpp:
    Код (Text):
    1. #include <iostream>
    2. #include "matrix.hpp"
    3.  
    4. //////////////////////////////////////////////////////////////////////////////
    5. the_matrix* FillArray();
    6. void DowngradeLevel( the_matrix,the_matrix*,the_matrix*);
    7. //////////////////////////////////////////////////////////////////////////////
    8. int main()
    9. {
    10.   the_matrix * input = FillArray();
    11.   the_matrix * strt = NULL;
    12.   the_matrix * end =NULL;
    13.   DowngradeLevel(*input,strt,end);
    14. }
    15.  
    16.  
    17.  
    18. the_matrix* FillArray()
    19. {   // получаем матрицу с клавы //
    20.   int hght,wdth;
    21.   int temp;
    22.   std::cout << "How many lines it'll be:";
    23.   std::cin >> hght;                 //зададим кол-во линий
    24.   std::cout << "How many columns it'll be:";
    25.   std::cin >> wdth;                 //кол-во столбцов
    26.  
    27.   the_matrix *input_matrix = new the_matrix(hght,wdth); // создаем матриццо
    28.  
    29.   std::cout << "input_matrix has been created...initialization...\n";
    30.   for(int i=1;i<=input_matrix->GetHeight();i++)
    31.   {
    32.     for (int j=1;j<=input_matrix->GetWidth();j++)
    33.     {
    34.       std::cin >> temp;
    35.       input_matrix->SetElement(i,j,temp);
    36.     }
    37.   }
    38.   /*///////////// проверим что вышло///////////////////////////////////////
    39.   for(int i=1;i<=input_matrix->GetHeight();i++)
    40.   {
    41.     for (int j=1;j<=input_matrix->GetWidth();j++)
    42.     {
    43.  
    44.       std::cout << input_matrix->GetElement(i,j) << " ";
    45.     }
    46.     std::cout << std::endl;
    47.   }*/
    48.   //std::cout << input_matrix->CalcOpredelitel()<<std::endl;
    49.  
    50.   std::cout << "Matrix has been created and initialized succesfull!\n";
    51.   return input_matrix;
    52. }
    53. /* знак (-1)^(i+j)*/
    54. int GetSign(int x)
    55. {
    56.   if (x % 2 == 0 )
    57.    return 1;
    58.   else
    59.    return -1;
    60.  
    61. }
    62. /*(входящая матрица, указатель на голову результирующего списка, указатель на его хвост)*/
    63.                    /*!!!!!!НЕ КОРМИТЬ ОДИНАРНЫМИ МАТРИЦАМИ!!!!!!!!*/
    64. void DowngradeLevel(the_matrix  input , the_matrix* start,the_matrix* end)
    65. {
    66.   the_matrix * temp_mtrx = new the_matrix(2,2); //ЗДЕСЬ ВЫЛЕТАЕТ!!!
    67.   for (int l = 1;l <= input.GetWidth();l++)
    68.   {
    69.     the_matrix * nextOne = new the_matrix(2,2);
    70.   }
    71.  
    72. }
    matrix.cpp:

    Код (Text):
    1. #include "matrix.hpp"
    2. /*###############################the_matrix class#############################*/
    3. the_matrix::the_matrix(int height,int width):
    4.   itsHeight(height),itsWidth(width)
    5. {
    6.    matrix = new int[itsHeight*itsWidth];
    7.    itsMultiplier = 1;
    8.    myNext = 0;
    9. }
    10.  
    11. the_matrix::the_matrix(const the_matrix & rhs)
    12. {
    13.   itsHeight = rhs.GetHeight();
    14.   itsWidth = rhs.GetWidth();
    15.   itsMultiplier = rhs.GetMultiplier();
    16.   delete []matrix;
    17.   matrix = new int[itsHeight*itsWidth];
    18.   for (int i = 1;i<=itsHeight;i++)
    19.   {
    20.     for (int j = 1;j<=itsWidth;j++)
    21.     {
    22.       matrix[(i-1)*itsWidth + j]=rhs.GetElement(i,j);
    23.     }
    24.   }
    25. }
    26.  
    27. the_matrix::~the_matrix()
    28. {
    29.   delete [] matrix;
    30. }
    31.  
    32.  
    33. void the_matrix::SetElement(int height,int width,int value)
    34. {
    35.   matrix[(height-1)*itsWidth+width]= value;// height-1 т.к массив начинается с нуля.
    36. }
    37.  
    38. int the_matrix::GetElement(int height,int width) const
    39. {
    40.   return (matrix[(height-1)*itsWidth+width]);// height-1 т.к массив начинается с нуля.
    41. }
    42.  
    43. int the_matrix::GetHeight() const
    44. {
    45.   return itsHeight;
    46. }
    47.  
    48. int the_matrix::GetWidth() const
    49. {
    50.   return itsWidth;
    51. }
    52.  
    53. void the_matrix::SetMultiplier(int x)
    54. {
    55.   itsMultiplier = x;
    56. }
    57.  
    58. int the_matrix::GetMultiplier() const
    59. {
    60.   return itsMultiplier;
    61. }
    62.  
    63. void the_matrix::SetMyNext(the_matrix*Next)
    64. {
    65.   myNext = Next;
    66. }
    matrix.hpp:
    Код (Text):
    1. class the_matrix // элементы нумеруются НАЧИНАЯ С ЕДИНИЦ!!!
    2. {                // теперь это симбиоз матрицы и указателя.
    3.   public:
    4.     the_matrix(int height,int width);                 // a11 a12 a13
    5.     the_matrix(const the_matrix &);                   // a21 a22 a23
    6.     ~the_matrix();                                    // a31 a32 a33
    7.  
    8.     void SetElement(int height,int width,int value);
    9.     int GetElement(int height,int width) const;
    10.  
    11.     void SetMultiplier(int x);
    12.     int GetMultiplier() const;
    13.  
    14.     int GetHeight() const;
    15.     int GetWidth() const;
    16.  
    17.     the_matrix * GetMyNext();
    18.     void SetMyNext(the_matrix *myNext);
    19.  
    20.   protected:
    21.     int itsHeight;
    22.     int itsWidth;
    23.     int itsMultiplier;
    24.     int * matrix;
    25.     the_matrix * myNext; // указатель на следующую матрицу.
    26.  
    27. };
     
  19. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Wert
    В функции
    the_matrix::the_matrix(const the_matrix & rhs)
    вот эта строка, видимо, и вызывает ошибку:
    delete []matrix;
    Ты уничтожаешь ещё не созданный массив.
     
  20. Wert

    Wert New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2007
    Сообщения:
    4
    maxdiver: пофиксил чуть раньше чем ты написал, однако ситуации это не изменило.
    опытным путем обнаружил, что вываливается любой конструктор the_matrix::the_matrix(in,int) вызываемый не из FillArray().
    Вроде бы вылет вызывает вот это:

    matrix = new int[itsHeight*itsWidth];

    только ума не приложу почему.

    И кстати еще : йа вот не совсем тот код написал- в оригинале выглядело так:
    void DowngradeLevel(the_matrix * input , the_matrix* start,the_matrix* end)
    поэтому конструктор копий в более ранней версии вообще не вызывался,однако ошибка была.