PDA

Просмотр полной версии : [c/c++] Новичкам: задаем вопросы


Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22]

4p3
06.05.2010, 00:33
Вопрос по visual studio 2008.
Возможно ли включить "счетчик" строк?
Чтоб видеть какая строка имеет какой номер?
А то не удобно искать ошибку в программе в 37 строк в ручную =))

два раза кликай по ошибке.

zlo12
07.05.2010, 11:16
Решил С++ выучить. На первом уроке запара =(
Вот в чём дело:
В учебнике (World С++) написан пример первой проги

#include <iostream.h>
void main(){
cout<<"Hello!\n";
}

Но вместо предполагаемого досовского окошка с надписью Hello вылезает
c:\documents and settings\visual studio 2010\Projects\xzz\
Debug\xzz.exe"" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Для продолжения нажмите любую клавишу . . .
В чём прикол?

rudvil
07.05.2010, 11:39
Решил С++ выучить. На первом уроке запара =(
Вот в чём дело:
В учебнике (World С++) написан пример первой проги

#include <iostream.h>
void main(){
cout<<"Hello!\n";
}

Но вместо предполагаемого досовского окошка с надписью Hello вылезает

В чём прикол?Во первых так...#include <iostream>

int main(int argc, char* argv[]) {
std::cout << "Hello World!\n";
std::cin.get();
return 0;
}

Besi
07.05.2010, 12:41
а не легче?
#include <iostream>
using namespace std

int main(int argc, char* argv[])
{
cout << "Hello World"<<endl;
return 0;
}

rudvil
07.05.2010, 13:13
а не легче?
#include <iostream>
using namespace std

int main(int argc, char* argv[])
{
cout << "Hello World"<<endl;
return 0;
}
Не было вопроса как "легче", был вопрос почему не работает, соответственно как должно быть правильно, а как легче и удобней человек пусть сам решает.

Besi
07.05.2010, 13:21
был вопрос почему не работает-2010 студия не работал с ней но думаю что она ещо сыровата
соответственно как должно быть правильно-ето самый лёгкий из вариантов как правильно

Ins3t
07.05.2010, 13:43
Беси, неймспейсы придумали для того, чтобы небыло конфликтов имен, а ты их в глобальные суешь. Разумеется, что в хэлло ворлд это роли не сыграет, но не стоет привыкать.

И сыроватой студия была во время первой бэты, сей час она отлично работает не смотря на то, что ресурсы жрет.

zlo12
07.05.2010, 14:46
ни одна из этих не работает =\

rudvil
07.05.2010, 14:52
ни одна из этих не работает =\
Попробуй создать "Empty project" и скомпилировать написанный мною выше код, если не пойдет - значит проблемы в студии, как вариант-переустановка студии.

BrainDeaD
07.05.2010, 14:53
попробуй создать пройект поновой и ничего не изменять кроме кода в main. может ты что-то стёр или изменил в дефолтном коде? или в названии файла ошибка вышла? короче пробуй.

Besi
07.05.2010, 15:05
Ins3t-ресурсы она жрёт нереально по етому и использую 2008
насчёт неймспейсов не спорю+не привыкаю))

zlo12-поидее у вас действительно тогда проблема в студии
если сново не запустится -скопируйте сюда ВЕСЬ код мейна

zlo12
07.05.2010, 15:07
короче ладно, спасибо, но это всё шляпа, я так ничему не научусь и ничего не пойму. Буду ковыряться сам.

оlbaneс
07.05.2010, 15:17
не работает походу из за того что не указал обязательный инклуд

#include "stdafx.h"
#include <iostream>
using namespace std

int main(int argc, char* argv[])
{
cout << "Hello World";
return 0;

Besi
07.05.2010, 15:20
оlbaneс перед написанием поста 5261 я об етом думал поетому и попросил весь код скопировать

zlo12
07.05.2010, 15:32
не работает походу из за того что не указал обязательный инклуд

#include "stdafx.h"
#include <iostream>
using namespace std

int main(int argc, char* argv[])
{
cout << "Hello World";
return 0;
Заработало! Получаеццо, что stdafx.h надо вписывать постоянно, без разницы что за прога хочет увидеть свет?

Besi
07.05.2010, 15:48
конечно!))))
я так и думал что в етом бага(при создании проекта ты походу автоматом убирал всё что было и ставил код удаляя #include "stdafx.h" что и послужило ошибой)

оlbaneс
08.05.2010, 14:09
за такую формулировку я буду гореть в аду.
не инклуд, а подключение библиотеки.
2беси в мэйне ты бы ничего не увидел и никто не увидел ;)

.::f-duck::.
08.05.2010, 15:48
iomanip - хедер манипуляторов.
Я так понимаю,он устарел?
Какой нынче в моде?

Ins3t
08.05.2010, 17:12
Что значит устарел?
Это стандартная библиотека С++, которая весьма не плохо выполняет свои функции.

zlo12
08.05.2010, 19:33
очередная шляпа приключилась.
Вроде всё делаю по книге, но что-то не то.
Компилятор очень ругаеццо. Подскажите

#include "stdafx.h"
#include <iostream>
int main()
{
enum Days {Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница, Суббота};
int choice;
std::cout << "Выбери день (0-6): ";
std::cin << choice;
if (choice = Воскресенье || choice == Суббота)
std::cout << "\nВыходные\n";
else
std::cout << "\nБудни\n";
return 0;
}

Linkus
08.05.2010, 19:41
zlo12, чё компилёр то говорит? и какой он? ))

upd:
std::cin << choice;


разве не так должно быть? -

std::cin >> choice;

upd2:

у меня работает в таком виде:

int main()
{

enum Days {Voskr, Pon, Vtor, Sre, Chet, Pt, Sub};
int choice;
std::cout << "Viberi den (0-6): ";
std::cin >> choice;
if ((choice == Voskr) || (choice == Sub))
std::cout << "\nVyh\n";
else
std::cout << "\nBudni\n";

return 0;
}

.::f-duck::.
09.05.2010, 13:04
Всюду писать std:: - не говнокод?
using namespace std;
И что делает ф-цтя getche(); (Зачем она нужна,пример)

yaneblinchik
09.05.2010, 14:22
Всюду писать std:: - не говнокод?

И что делает ф-цтя getche(); (Зачем она нужна,пример)
1 Говнокод,можно и по -другому выстроить код

2 Ждет пока введут что нибудь с клавиатуры

Besi
09.05.2010, 14:34
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int choice;

cout << "Entrer Day (0-6): ";
cin >> choice;

if(choise<7 && choise>=0)
{
if (choice == 5 || choice ==6)
cout << "Weekend"<<endl;;
else
cout << "Week-days"<<endl;
}
else
cout<<"Day Enter not correctly"<<endl;

return 0;
}


//должно работать нормально


немного сайтов
http://www.cyberguru.ru/cpp-sources/
http://www.msmfc.net/
http://www.sql.ru/Forum/actualtopics.aspx?bid=21

yaneblinchik
09.05.2010, 14:48
#include <iostream>
using namespace std;
int main()
{
enum Days {Voskr, Pon, Vtor, Sre, Chet, Pt, Sub};
int choice;
cout << "Enter Day (0-6): ";
cin >> choice;
if ((choice == Voskr) || (choice == Sub))
cout << "Vyh"<< endl;
else
cout << "Budni"<< endl;
return 0;
cin.get();
}

VIP
09.05.2010, 20:20
Возник вопрос по OpenGL :

Возможно ли с помощью Glaux сделать меню? Обычное или контекстное - неважно.

P.S. По графике темы на форуме не нашёл, поэтому запостил сюда, ибо пишу на плюсах

Ins3t
09.05.2010, 21:50
Всюду писать std:: - не говнокод?

И что делает ф-цтя getche(); (Зачем она нужна,пример)

Назови хотя бы одну причину, по которой применения пространства имен std к некому объекту является говнокодом.

А по поводу глобальных неймспейсов, по моему, уже не раз говорилось.

.::f-duck::.
09.05.2010, 21:56
Ins3t,нутк,понятно,если там пару надо вписать,а если строк 200. Это представляешь,сколько лишнего говна?

Ins3t
10.05.2010, 00:27
Ну да, разумеется нужно пихать неймспейсы в глобальные, чтобы избежать написания "std::", и плевать что может возникнуть конфликт имен.

Это можно делать в определенных случаях и весьма не обязательно.

А говнокодом можно назвать примерно следующее:


case UP : o > 0 ? o-- : o = FIELD_SIZE - 1; break;


А указывать пространство имен - это вполне нормально.

rudvil
12.05.2010, 12:17
#include <iostream>
#include <map>
#include <string>
#include <utility>

int main(int argc, char* argv[]) {
std::map<std::string, std::pair<int, int> > files;
files["0.txt"] = std::make_pair(0, 7);
files["1.txt"] = std::make_pair(8, 41);
files["2.txt"] = std::make_pair(42, 50);

return 0;
}


Есть такая вот хеш-таблица, как максимально эффективно получить доступ к key этой таблицы имея только одну цифру, например 21.
Т.е. нужно в каждом элементе сравнивать находится ли данное число(21) среди диапазона std::pair текущего элемента... и если наш (21) оказался в диапазоне какого-либо std::pair, то мы возвращаем key...
Вот так я собирался делать вручную
std::map<std::string, std::pair<int, int> >::const_iterator begin = files.begin();
std::map<std::string, std::pair<int, int> >::const_iterator end = files.end();
int num = 21;
for (; begin != end; ++begin) {
if (num >= (*begin).second.first && num <= (*begin).second.second) {
std::cout << "Found in " + (*begin).first + "\n";
break;
}
}
Хотелось бы увидеть пример с использованием stl алгоритмов, спасибо.

wolmer
13.05.2010, 05:16
Как прочитать/вывести первую строку из файла на WINAPI?
(вариант fgets - не интересует)

Ra$cal
13.05.2010, 09:26
rudvil
ну тут тока std::for_each, а для связывания проще и удобнее использовать http://www.rsdn.ru/article/cpp/boost.bind.xml

Ins3t
13.05.2010, 09:33
Как прочитать/вывести первую строку из файла на WINAPI?
(вариант fgets - не интересует)
ReadFile() из windows.h
читaй покa нe встрeтишь пeрeвод строки.

St0nX
13.05.2010, 10:10
ReadFile() из windows.h
читaй покa нe встрeтишь пeрeвод строки.
По моему лучше будет считать весь файл(часть его если он большой) в память и потом только разбить на строки.

rudvil
13.05.2010, 15:58
rudvil
ну тут тока std::for_each, а для связывания проще и удобнее использовать http://www.rsdn.ru/article/cpp/boost.bind.xml
Возникла проблема =/#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <string>
#include <utility>

#include <boost/bind.hpp>

int main(int argc, char* argv[]) {
typedef std::map<std::string, std::pair<int, int> > map_type;
map_type files;
files["0.txt"] = std::make_pair(0, 7);
files["1.txt"] = std::make_pair(8, 41);
files["2.txt"] = std::make_pair(42, 50);
int num = 21;
map_type::const_iterator elem;
elem = std::find_if(
files.begin(),
files.end(),
boost::bind(
std::logical_and<bool>(),
boost::bind(
std::greater_equal<int>(),
boost::bind(
&map_type::value_type::second_type::first_type,
_1),
num),
boost::bind(
std::less_equal<int>(),
boost::bind(
&map_type::value_type::second_type::second_type,
_1),
num)));
if (elem != files.end())
std::cout << "Found in " + (*elem).first + "\n";
return 0;
}


Компилятор ругается main.cpp:26: error: expected primary-expression before ',' token
main.cpp:32: error: expected primary-expression before ',' tokenт.е. на это:
линия (26) &map_type::value_type::second_type::first_type,
и на это:
линия (32) &map_type::value_type::second_type::second_type,

т.е. как это expected, если с примером который тут http://www.rsdn.ru/article/cpp/boost.bind.xml#EYVAE всё ок(компилирует без ошибок), а тут на тебе...

rudvil
13.05.2010, 17:10
Я сделал его!!! :D
Может кому понадобится, вот код - правда он стал, ммм... не таким понятным как тут (https://forum.antichat.ru/showpost.php?p=2138400&postcount=5280) :D
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <string>
#include <utility>

#include <boost/bind.hpp>

int main(int argc, char* argv[]) {
typedef std::map<std::string, std::pair<int, int> > map_type;
map_type files;
files["0.txt"] = std::make_pair(0, 7);
files["1.txt"] = std::make_pair(8, 41);
files["2.txt"] = std::make_pair(42, 50);
int num = 21;
map_type::const_iterator elem;
elem = std::find_if(
files.begin(),
files.end(),
boost::bind(
std::logical_and<bool>(),
boost::bind(
std::less_equal<int>(),
boost::bind(
&map_type::value_type::second_type::first,
boost::bind(
&map_type::value_type::second,
_1)
),
num),
boost::bind(
std::greater_equal<int>(),
boost::bind(
&map_type::value_type::second_type::second,
boost::bind(
&map_type::value_type::second,
_1)
),
num)));
if (elem != files.end())
std::cout << "Found in " + (*elem).first + "\n";
return 0;
}

После выполнения мы получим следующееFound in 1.txt
, т.е. 21 находится между 8 и 41.

Ra$cal
13.05.2010, 19:48
молодец =)
Если вдруг интересно зачем такой гемор:
1) У тебя крайний случай когда нет никаких методов, обычно более менее общую логику суют в классы, а дальше композиция получается проще.
2) Суть использования stl - например если решат наконец добавить распараллеливание независимых задач, то стл попадет под это первым со своим for_each, find, transform и всеми остальными алгоритмами. Будет на автопилоте при запуске решаться сколько ядер есть в распоряжении и параллелиться. Но пока это мечты мечты =\
3) С лямбда выражениями, которые в новом стандарте добавились, кодить юзая алгоритмы будет еще проще

M.W.N.N.
14.05.2010, 21:31
Здравствуйте.
Подскажите пож-та что не так.
Решил разобратся с curl + с++
Нашел примеры - http://pblog.ru/?p=607
Там приводят листинг:


#include <stdio.h>
#include <curl/curl.h>
//главная функция
int main(void)
{
//уже знакомый объект CURL
CURL *curl;
//объект - результат вызова функции curl_easy_perform
CURLcode res;
//выполняем инициализацю
curl = curl_easy_init();
if(curl) { //проверяем
//задаем опцию - получить страницу по адресу http://google.com
curl_easy_setopt(curl, CURLOPT_URL, "google.com");
//указываем прокси сервер
curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
//задаем опцию отображение заголовка страницы
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
//вызываем функцию, выполняющюю все операции, заданные в опциях (получение страницы, передача данных и т.д.), результат - объект типа CURLcode
res = curl_easy_perform(curl);
//выполняем обязательное завершение сессии
curl_easy_cleanup(curl);
}
return 0;
}


При попытке компиляции пишет:


:~/cpp$ g++ -o curl curl.cpp
/tmp/ccUnjuIz.o: In function `main':
curl.cpp:(.text+0xa): undefined reference to `curl_easy_init'
curl.cpp:(.text+0x31): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0x4d): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0x69): undefined reference to `curl_easy_setopt'
curl.cpp:(.text+0x75): undefined reference to `curl_easy_perform'
curl.cpp:(.text+0x85): undefined reference to `curl_easy_cleanup'
collect2: ld returned 1 exit status


Что не так?

Ra$cal
14.05.2010, 22:12
lib файл подключен? или какой там файл в никсах

M.W.N.N.
14.05.2010, 22:24
А какой подключать то? Я думал что библиотеки curl/curl.h хватит

rudvil
14.05.2010, 22:29
А какой подключать то? Я думал что библиотеки curl/curl.h хватит
цитата с того-же сайта...Разумеется, перед тем, как начать использование библиотеку – ее нужно получить, установить и дать возможность, своему компилятору, использовать ее. Рассмотрим выполнение этих действий, как обычно на примере двух платформ: Linux и Windows.

В случае Linux – все довольно просто, Вам необходимо скачать http://curl.haxx.se/download/curl-7.16.2.zip
В этом архиве содержиться полный исходный код библиотеки, скрипты сборки, а так же полная документация API и примеры (поэтому пользователям Windows так же не помешает скачать себе этот архив)
После распаковки – необходимо выполнить стандартную процедуру компиляции и установки, с помощью configure и make && make install. Это все, можно пользоваться возможностями библиотеки.
Для компиляции программы, следуюет добавлять к опциям компилятора

Код:

pkg-config --libs libcurl
pkg-config --cflags libcurl
либо

Код:

curl-config --libs libcurl
curl-config --cflags libcurl

M.W.N.N.
14.05.2010, 22:50
Конкретно если не сложно приведите пример как скомпилить, чето все никак не вьеду

Ra$cal
15.05.2010, 00:58
После распаковки – необходимо выполнить стандартную процедуру компиляции и установки, с помощью configure и make && make install.

Для компиляции программы, следуюет добавлять к опциям компилятора

Код:

pkg-config --libs libcurl
pkg-config --cflags libcurl
либо

Код:

curl-config --libs libcurl
curl-config --cflags libcurl

Что еще то писать?

diov1213
15.05.2010, 11:17
Установил компилятор C++BUILDER а как им пользоваться незнаю помогите

оlbaneс
15.05.2010, 11:39
Установил компилятор C++BUILDER а как им пользоваться незнаю помогите
http://www.softportal.com/software-4157-uchebnik-po-programmirovaniyu-v-srede-c-builder.html
http://itbookz.ru/prog/lang/cbuilder/
http://cbuilder.ru/
http://list.mail.ru/10356/1/0_1_0_1.html

DiHWO
15.05.2010, 15:13
Что предпочтительнее использовать "printf()" или "std::cout" и почему?

BrainDeaD
15.05.2010, 15:17
зависит от ЯП. c - printf(), c++ - std::cout.
потому что это стандартные функции ввода/вывода этих языков.
стоит почитать книжки.

DiHWO
15.05.2010, 15:20
BrainDeaD, спс.
P.S. ачат лучше чем книжка :)

оlbaneс
15.05.2010, 16:08
зависит от ЯП. c - printf(), c++ - std::cout.
потому что это стандартные функции ввода/вывода этих языков.
стоит почитать книжки.
чтобы каждый раз не писать std:: проще указать пространство имен сразу.
#include <iostream.h>
using namespace std;

int main() {
cout << "tra-lya-lya!" << endl;
return 0;
}
а так да, лучше начать с книжек

дихво, вот прочти http://programmersforum.ru/showthread.php?t=7566

BrainDeaD
15.05.2010, 16:16
я всего лишь цитировал из вопроса.
а по поводу, что проще и лучше читай стр. 528 этого топика.

DiHWO
15.05.2010, 16:41
оlbaneс, про using namespace знаю, мне просто нравиться писать std:: и всё.
--------------------------------------
http://programmersforum.ru/showthread.php?t=7566
прочитал, ничего нового не узнал.
--------------------------------------
для чего писать endl?

.::f-duck::.
15.05.2010, 16:58
endl?
Конец строки. End Line

yaneblinchik
15.05.2010, 17:03
Конец строки. End Line
Следующая строка , аналог \n

rudvil
15.05.2010, 17:10
Следующая строка , аналог \n
Конец строки. End Line
не только,Inserts a new-line character.
Additionally, for buffered streams, endl flushes the buffer (i.e. writes all unwritten characters in the buffer to the output sequence, see ostream::flush).
т.е. новая строка + записывает содержимое буфера

Ins3t
15.05.2010, 21:50
чтобы каждый раз не писать std:: проще указать пространство имен сразу.
#include <iostream.h>
using namespace std;

int main() {
cout << "tra-lya-lya!" << endl;
return 0;
}
а так да, лучше начать с книжек

дихво, вот прочти http://programmersforum.ru/showthread.php?t=7566

Если ты подключаешь iostream.h - у тебя старый компилятор, следовательно указание пространства имен не нужно, так как в старых версиях компиляторов С++ не было никаких именных пространств.

qwert135
15.05.2010, 22:38
Всем привет.Проблема в следующем: у меня есть следующая функция, для построения полинома Лагранжа:
double Lagrange(double *X, double *Y, int NumberOfKnots, double X_input){
double solution = 0, *temp;
int i, j;

temp = new double[NumberOfKnots];

for(i = 0;i < NumberOfKnots;i++){
temp[i] = 1;
for(j = 0;j < NumberOfKnots;j++){
if(i != j){
temp[i] = temp[i] * (X_input - X[j]) / (X[i] - X[j]);
}
}
solution = solution + Y[i] * temp[i];
}

delete []temp;
return solution;
}
Теперь мне нужно взять первую и вторую производную, ток я хз как. Есть конечно одна идея, а именно: находить производные от выражений Y[i] * temp[i] и потом просуммировать все полученные производные, но может кто алгоритм получше подскажет.Заранее спасибо.

оlbaneс
15.05.2010, 22:49
Если ты подключаешь iostream.h - у тебя старый компилятор, следовательно указание пространства имен не нужно, так как в старых версиях компиляторов С++ не было никаких именных пространств.
#include "stdafx.h"
#include <iostream>

using namespace std;

int main( int argc, char argv[] )
{
for( int number = 98765; number > 0; number /=10 )
{
ты победил :)
у меня студио 2008, а код я в гугле взял.

Irdis
16.05.2010, 01:13
qwert135
Если есть функция (или полином (пофиг)) (в математическом понятии этого слова).
То производную найти не проблема(в программировании). А именно, нужно пытаться аппроксимировать значения производной в точке из определения производной. ( ну вы поняли, значение производной в т. х0 = пределу при х->x0 (f(x)-f(x0))/x-x0; а это значит: чтобы получить приблизительное зн. производной необходимо взять (например) вместо x -> xFix и xFix-x=10^-10 ) Для второй производной тоже самое только формула другая =).

qwert135
16.05.2010, 02:47
qwert135
Если есть функция (или полином (пофиг)) (в математическом понятии этого слова).
То производную найти не проблема(в программировании). А именно, нужно пытаться аппроксимировать значения производной в точке из определения производной. ( ну вы поняли, значение производной в т. х0 = пределу при х->x0 (f(x)-f(x0))/x-x0; а это значит: чтобы получить приблизительное зн. производной необходимо взять (например) вместо x -> xFix и xFix-x=10^-10 ) Для второй производной тоже самое только формула другая =).
спасибо,попробую реализлвать

DiHWO
16.05.2010, 08:39
Как оправлять через c++ данные методом POST на сервер, есть что почитать? Базовые знания есть, создавал сервер который слушает порт, и клиент, который на порт который слушает сервер отправляет данные.

qwert135
16.05.2010, 13:49
Теперь мучает вторая часть вопроса.Как найти вторую производную?))

SeNaP
16.05.2010, 14:31
Всем привет.
Кому не трудно, набросайте пожалуйста программку, которая
Скопирует сама себя в папку C:\Windows
Или дайте ссылку на мануалы по этим функциям :)

Irdis
16.05.2010, 15:31
qwert135
Если не вдаваться в объяснения. то
f''(x) = (f(x_left)-2f(x)+f(x_right))/(h^2)
h = |x_left-x|=|x_right-x| = что-то оч. малое
x_left-x<0;
x_right-x>0;
---------------
В общем тут всё понятно, так как вторая производная это производная первой производной...

qwert135
16.05.2010, 17:06
Irdis
спасиб.А как можно проверить пустой файл или нет(файл текстовый, желательно пример)

b82a
17.05.2010, 15:09
Irdis
спасиб.А как можно проверить пустой файл или нет(файл текстовый, желательно пример)
Можно юзать file_stat


// read file status, print size, dates etc
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
struct stat file_stat;
int status;
char filename[50]={0};
printf("enter filename ? ");
scanf("%s", filename);
int fildes = open(filename, O_RDWR); // open file

// get file status for details see
// http://www.opengroup.org/onlinepubs/007908799/xsh/fstat.html
status = fstat(fildes, &file_stat); // get its status

// print file status informations for details see
// http://www.opengroup.org/onlinepubs/007908799/xsh/sysstat.h.html
printf("file %s size %d\n", filename, file_stat.st_size); // print status
printf("last access %s\n", ctime(&file_stat.st_atime));
printf("last mofification %s\n", ctime(&file_stat.st_mtime));
printf("last status change %s\n", ctime(&file_stat.st_ctime));
return 0;
}

yaneblinchik
17.05.2010, 15:41
Можно юзать file_stat


// read file status, print size, dates etc
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
struct stat file_stat;
int status;
char filename[50]={0};
printf("enter filename ? ");
scanf("%s", filename);
int fildes = open(filename, O_RDWR); // open file

// get file status for details see
// http://www.opengroup.org/onlinepubs/007908799/xsh/fstat.html
status = fstat(fildes, &file_stat); // get its status

// print file status informations for details see
// http://www.opengroup.org/onlinepubs/007908799/xsh/sysstat.h.html
printf("file %s size %d\n", filename, file_stat.st_size); // print status
printf("last access %s\n", ctime(&file_stat.st_atime));
printf("last mofification %s\n", ctime(&file_stat.st_mtime));
printf("last status change %s\n", ctime(&file_stat.st_ctime));
return 0;
}

Это же на C?

b82a
17.05.2010, 16:29
Это же на C?
А он указал конкретный язык?

agrofyl2
17.05.2010, 17:19
Здравствуйте.
У меня есть код инжекта DLL

#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <shlwapi.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "shlwapi.lib")


//I could just use PROCESS_ALL_ACCESS but it's always best to use the absolute bare minimum of priveleges, so that your code works in as
//many circumstances as possible.
#define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)

BOOL WriteProcessBYTES(HANDLE hProcess,LPVOID lpBaseAddress,LPCVOID lpBuffer,SIZE_T nSize);

BOOL LoadDll(char *procName, char *dllName);
BOOL InjectDLL(DWORD ProcessID, char *dllName);
unsigned long GetTargetProcessIdFromProcname(char *procName);

bool IsWindowsNT()
{
// check current version of Windows
DWORD version = GetVersion();
// parse return
DWORD majorVersion = (DWORD)(LOBYTE(LOWORD(version)));
DWORD minorVersion = (DWORD)(HIBYTE(LOWORD(version)));
return (version < 0x80000000);
}

//int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
int main() {
cout << "Hello\n";
Sleep(2000);
while(1) {
cout << "\n---------------------------------------------\n";
char process[101], dllname[101];
cout << "Enter process name (example: hl.exe)\n";
cin.getline(process, 100);
cout << "Enter dll name (example: 1vs16.dll)\n";
cin.getline(dllname, 100);
cout << "Try inject...\n";
cout << "Process: " << process << " dll: " << dllname << endl;
if(IsWindowsNT()) LoadDll(process, dllname);
else cout << "Your system does not support this method";
}
return 0;
}


BOOL LoadDll(char *procName, char *dllName)
{
DWORD ProcID = 0;

ProcID = GetTargetProcessIdFromProcname(procName);
cout << "Process ID: " << ProcID << endl;

if(!(InjectDLL(ProcID, dllName))) cout << "Process located, but injection failed\n";
else cout << "Successful!\n";

return true;
}

BOOL InjectDLL(DWORD ProcessID, char *dllName)
{
HANDLE Proc;
char buf[50]={0};
LPVOID RemoteString, LoadLibAddy;

if(!ProcessID)
return false;

Proc = OpenProcess(CREATE_THREAD_ACCESS, FALSE, ProcessID);

if(!Proc)
{
sprintf(buf, "OpenProcess() failed: %d", GetLastError());
cout << buf << endl;
return false;
}

LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(dllName), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(Proc, (LPVOID)RemoteString, dllName, strlen(dllName), NULL);
CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);

CloseHandle(Proc);

return true;
}

unsigned long GetTargetProcessIdFromProcname(char *procName)
{
PROCESSENTRY32 pe;
HANDLE thSnapshot;
BOOL retval, ProcFound = false;

thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if(thSnapshot == INVALID_HANDLE_VALUE)
{
cout << "Error: unable to create toolhelp snapshot\n";
return false;
}

pe.dwSize = sizeof(PROCESSENTRY32);

retval = Process32First(thSnapshot, &pe);

while(retval)
{
if(StrStrI(pe.szExeFile, procName) )
{
ProcFound = true;
break;
}

retval = Process32Next(thSnapshot,&pe);
pe.dwSize = sizeof(PROCESSENTRY32);
}
return pe.th32ProcessID;
}


он работает.
Вопрос - как выгрузить длл, загруженную таким образом, из процеса

Ra$cal
17.05.2010, 17:27
все тоже самое, только сменить функцию с LoadLibrary на FreeLibrary.

agrofyl2
17.05.2010, 18:24
В этой строчке?
LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
LoadLibraryA-> FreeLibrartA ?

Пробовал, не выгружается так.

Ra$cal
17.05.2010, 18:33
да, точно. функция требует хэндл библиотеки. ну вариантов два - либо через tool help функции обойти все модули в требуемом процессе и найти нужную, либо сделать сделать инъекцию кода который внутри того процесса выполнит GetModuleHandle, FreeLibrary

olesy
17.05.2010, 20:13
здрасти в ето строке
char** arr=malloc(sizeoff(char*)*count);

выдает ерор cannot convert from void to char, как исправить ето?

Ins3t
17.05.2010, 20:59
Сделай приведение типа, например:

char * var = (char*)malloc( size );

olesy
17.05.2010, 21:52
Сделай приведение типа, например:

char * var = (char*)malloc( size );


char ** var = char*malloc( size ); зделал так теперь ерор type char unexpected

Ra$cal
17.05.2010, 21:55
скобочки решил оптимизировать? если уж совсем ничего не знаешь - копируй как показали.

olesy
17.05.2010, 21:58
тогда идет вапше куча ероров

size underclared identifier
arr underclared identifier

Ins3t
17.05.2010, 22:31
To olesy:

size underclared identifier
arr underclared identifier

Ошибки говорят о том, что не определены arr и size, следовательно могу предположить что ты просто все скопировал не объявил необходимых переменных.

Твой пример будет выглядеть примерно так:

char **arr = (char**)malloc( sizeof(char*) * count );

Дабы не возник вопрос типа:

А почему выдает count underclared identifier ?

Отвечу - необходимо заранее объявить переменную count.

Например так:

int count = 10;

d_x
17.05.2010, 22:36
olesy, ты все со своими заданиями мучаешься? Если в Visual Studio компилируешь, делай примерно так:

#include "stdlib.h"
#include "stdio.h"
#include "string.h"

int main()
{
int count = 5;
int good = 0;
int i, j, len, num = 0;

char** arr = (char**) malloc(sizeof(char*) * count);

arr[0] = "string 1";
arr[1] = "string 2";
arr[2] = "string without numbers";
arr[3] = "also, no numbers";
arr[4] = "str 5";

printf("Strings that do not contain any numbers:\n");

for(i=0; i<count; i++)
{
good = 1;

for(j=0, len = strlen(arr[i]); j < len; j++)
{
if(arr[i][j] >= 48 && arr[i][j] <= 57)
{
good = 0;
break;
}
}

if(good)
{
num++;
printf("\n%s", arr[i]);
}
}

printf("\n\nTotal number: %u", num);

free(arr);
return 0;
}

olesy
17.05.2010, 22:43
спасибо но я както хотел сам)

rudvil
24.05.2010, 11:09
Есть ли смысл для оптимизации, передавать аргументы функции через указатель, напримерvoid show_msg(std::string& msg) {
std::cout << msg;
}если учитывать что эта функция вызывается очень часто и с средним кол. символов в "msg" - 500
Т.е. насколько я понимаю если не передавать через указатель, то при каждом вызове будет происходить копия этого "msg" и последующий его вывод... что мне впринципе нафиг не надо, тогда уже лучше везде прописывать аргументы через ссылки.
Ну не везде, но во всяком случае там - где я точно знаю что в функ. с ним никаких операция кроме чтения не будет.
Есть ли смысл с этим заморачиваться?

Byte_
24.05.2010, 11:13
Есть ли смысл для оптимизации, передавать аргументы функции через указатель, напримерvoid show_msg(std::string& msg) {
std::cout << msg;
}если учитывать что эта функция вызывается очень часто и с средним кол. символов в "msg" - 500
Т.е. насколько я понимаю если не передавать через указатель, то при каждом вызове будет происходить копия этого "msg" и последующий его вывод... что мне впринципе нафиг не надо, тогда уже лучше везде прописывать аргументы через ссылки.
Ну не везде, но во всяком случае там - где я точно знаю что в функ. с ним никаких операция кроме чтения не будет.
Есть ли смысл с этим заморачиваться?

на сколько я понимаю, тут выгоднее написать
inline void show_msg(std::string msg) {std::cout << msg;}

rudvil
24.05.2010, 11:18
на сколько я понимаю, тут выгоднее написать
inline void show_msg(std::string msg) {std::cout << msg;}
Да, спасибо это вариант, но ведь копирование аргумента по прежнему будет?

Byte_
24.05.2010, 11:21
Да, спасибо это вариант, но ведь копирование аргумента по прежнему будет?
если я правильно понимаю механизм inline функций в C, то нет... в такой функции тело заменяет вызов при компиляции. но следует учесть, что inline может быть не воспринят компилятором (это рекомендация а не условия для компилятора).

rudvil
24.05.2010, 11:27
если я правильно понимаю механизм inline функций в C, то нет... в такой функции тело заменяет вызов при компиляции. но следует учесть, что inline может быть не воспринят компилятором (это рекомендация а не условия для компилятора).
Хмм, ещё раз спасибо - попробую и так - и так, проведу пару тестов, посмотрим где компилятору(в плане оптимизации) больше понравится =]

Byte_
24.05.2010, 11:39
Хмм, ещё раз спасибо - попробую и так - и так, проведу пару тестов, посмотрим где компилятору(в плане оптимизации) больше понравится =]
напиши потом. заинтриговал =)

rudvil
24.05.2010, 12:14
напиши потом. заинтриговал =)
Забавно получилось, как говорится не знаешь не трогай ^^
результаты в мс.
1174
752
751
752
748
1043
1024
781
752
751
925
750
753
748
756
774
746
770
759
750
959
764
772
757
757
770
761
771
758
808
Вывод следующий - с такой мелкой оптимизации смысла нет заморачиваться, компилятор всё сделает за тебя.

Byte_
24.05.2010, 12:43
rudvil, скорее всего он не воспринял inline из-за использования std...
судя по всему способ 1 = способу 3

rudvil
24.05.2010, 12:49
rudvil, скорее всего он не воспринял inline из-за использования std...
судя по всему способ 1 = способу 3
Как бы там ни было если уж оптимизировать, то оптимизировать нужно скорее общий алгоритм программы, чем всякую мелочь =]

STLcRash
24.05.2010, 12:52
подскажите как после очистки кэша IE
var lpEntryInfo: PInternetCacheEntryInfo; hCacheDir: LongWord; dwEntrySize: LongWord; dwLastError: LongWord; begin dwEntrySize := 0; FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize); GetMem(lpEntryInfo, dwEntrySize); hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize); if (hCacheDir <> 0) then DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName ); FreeMem(lpEntryInfo); repeat dwEntrySize := 0; FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize); dwLastError := GetLastError(); if (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin GetMem(lpEntryInfo, dwEntrySize); if (FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize)) then DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName ); FreeMem(lpEntryInfo); end; until (dwLastError = ERROR_NO_MORE_ITEMS);
добавить в уже отчищенный кэш куки из edit1.text

BrainDeaD
24.05.2010, 13:59
чувак, это ж не с/с++. ты либо темой ошибся, либо языком.
cookie записываются в файл. для этого тебе надо знать содержание и место хранения cookies.

_iks_
24.05.2010, 20:16
Какой оператор вычисляет целую часть от деления(с++)? По типу div в Паскале надо.

Спасибо.

Ins3t
24.05.2010, 20:19
inline void show_msg(std::string msg) {std::cout << msg;}

Инлайн-подставка применяется к очень маленьким функциям. При использовании инлайн-подставки компилятор будет генеририровать для функции соответствующий код в месте ее вызова. Это увеличит скорость вызова функции, но не избавит от затрат на копирование.

rudvil, скорее всего он не воспринял inline из-за использования std...

Что-то новое...

M_script_
24.05.2010, 20:25
Какой оператор вычисляет целую часть от деления(с++)? По типу div в Паскале надо.
int a = 10; int b = 4; int c = a/b;
c == 2

M_script_
24.05.2010, 20:35
на сколько я понимаю, тут выгоднее написать
inline void show_msg(std::string msg) {std::cout << msg;}

выгоднее написать
#define show_msg(s) std::cout << s

.::f-duck::.
24.05.2010, 21:11
1.Как обозначить двоичную систему в С++?
2.Как получить доступ к n члену переменной типа int (C++)?

Irdis
24.05.2010, 21:13
1 bool
2 вы про что?

.::f-duck::.
24.05.2010, 21:17
Ну,например,есть переменная:

int one = 1000;

Как вывести,скажем, 2 член?
Было бы это char, то cout << one[2];

Ins3t
24.05.2010, 21:19
2.Как получить доступ к n члену переменной типа int (C++)?

Возможно вы имели в виду получение доступа к N'ому элементу массива?

Тогда проще быть не может:

int arrayNumbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

На пример получить доступ к первому элементу массива можно следующим образом:

arrayNumbers[ 0 ];

0 - потому что массив индексируются начиная с нуля.

UPD:

Ну,например,есть переменная:

int one = 1000;

Как вывести,скажем, 2 член?
Было бы это char, то cout << one[2];

int var = 1000;

int var1 = var % 10; // Это последнее число - 0.
int var2 = var % 100; // предпоследнее - 0.
int var3 = var % 1000; // второе - 0.
int var4 = var % 10000; // первое - 1.

Но это изврат ,)

Ra$cal
24.05.2010, 21:53
M_script_
отнюдь не выгоднее, и банально неправильно. это си стайл. не юзают с плюсами. правильно юзать инлайн меотды.

M_script_
25.05.2010, 13:21
M_script_
отнюдь не выгоднее, и банально неправильно. это си стайл. не юзают с плюсами. правильно юзать инлайн меотды.

Что тут неправильно? Инлайн функции - это совершенно другое. Вопрос был в том, как сделать удобнее написание кода и сохранить скорость работы программы.

.::f-duck::.
25.05.2010, 13:22
НОРМАЛЬНОЕ чтиво по ВинСокетам в С++.
Ссылки,желательно на русском.

yaneblinchik
25.05.2010, 13:29
НОРМАЛЬНОЕ чтиво по ВинСокетам в С++.
Ссылки,желательно на русском.
Обычно такие запросы остаются без ответа,так как собственно посвященной именно винсоку книги не встречал,но есть статьи...
Обычно винсок оговаривается в главе какой либо книге,я честно не помню
Почитай к примеру это http://hardteam.ucoz.ru/publ/4-1-0-27

rudvil
25.05.2010, 13:31
Что тут неправильно? Инлайн функции - это совершенно другое. Вопрос был в том, как сделать удобнее написание кода и сохранить скорость работы программы.
Вопрос был в том, имеет ли смысл оптимизировать функц., как в последствии оказалось нет.
вдобавок у меня эта функция вызывается через указательstd::map<std::string, void(*)(std::string)> tbl;
(tbl["show_msg"])("MESSAGE");
define тут не прокатит, и Ra$cal прав это с++, а не си

M_script_
25.05.2010, 15:49
вдобавок у меня эта функция вызывается через указатель
Если функция вызывается через указатель, о каком инлайне может идти речь? :confused:

agrofyl2
25.05.2010, 16:25
народ как в sprintf в строку вписать знак % ??
так sprintf(p, "%windir%") есстественно не получается.
помогите плиз!

klown
25.05.2010, 17:00
agrofyl2,может быть заэкранировать его? типа "\%"

Ins3t
25.05.2010, 17:06
To agrofyl2:


//////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
//////////////////////////////////////////////////////////////////////////////////////////////
int main ()
{
char buffer[50];

sprintf( buffer, "%%windir%%" );
printf ( "%s\n", buffer );
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////


В выводе получим "%windir%".

UPD:

agrofyl2,может быть заэкранировать его? типа "\%"

Вы хотя бы проверяли ваши примеры перед тем как советовать.

agrofyl2
25.05.2010, 21:01
аа, так же как со слешем - удвоение. спасибо

zeppe1in
25.05.2010, 21:18
нужен такой массив. что бы по числу извлечь строку.
123 - abc
5694 - qwe
9999 - asdf
char* str[9999] для 3х строк не вариант. а как сделать?
заюзать map?
map <int,string> str;
и выполнять такой код?
str[123]="abc";
str[5694]="qwe";
str[9999]="asdf";
мне всего то нужно проверять есть ли строка соответствующая числу, и выводить её если есть. а как сделать не придумать)

Lee_fx
26.05.2010, 03:17
и выполнять такой код?
str[123]="abc";
str[5694]="qwe";
str[9999]="asdf";
Прикольно, а откуда строки то? Намертво вшиты в код?

Byte_
26.05.2010, 09:07
нужен такой массив. что бы по числу извлечь строку.
123 - abc
5694 - qwe
9999 - asdf
char* str[9999] для 3х строк не вариант. а как сделать?
заюзать map?
map <int,string> str;
и выполнять такой код?
str[123]="abc";
str[5694]="qwe";
str[9999]="asdf";
мне всего то нужно проверять есть ли строка соответствующая числу, и выводить её если есть. а как сделать не придумать)
ну честно говоря, только бред в голову лезет =)
создаем int *index = new int[9999];
создаем char **str;//ну массив не буду расписывать

и делаем следующие str[index[123]]...

то есть элемент index хранит номер строки в строковом массиве, в номер записи в index это то число что ты хочешь.... как-то так =)

Irdis
26.05.2010, 12:15
заюзать map?
map <int,string> str;
и выполнять такой код?
str[123]="abc";
str[5694]="qwe";
str[9999]="asdf";
да
2Byte_
ну честно говоря, только бред в голову лезет =)
это точно не вариант

Besi
26.05.2010, 12:19
обязательно использование массива?

razb
26.05.2010, 12:25
нужен такой массив. что бы по числу извлечь строку.
123 - abc
5694 - qwe
9999 - asdf
char* str[9999] для 3х строк не вариант. а как сделать?
заюзать map?
map <int,string> str;
и выполнять такой код?
str[123]="abc";
str[5694]="qwe";
str[9999]="asdf";
мне всего то нужно проверять есть ли строка соответствующая числу, и выводить её если есть. а как сделать не придумать)
_http://www.cplusplus.com/reference/stl/map/

zeppe1in
26.05.2010, 15:31
Прикольно, а откуда строки то? Намертво вшиты в код?
да, вшиты намертво.
обязательно использование массива?
нет. мне всего то нужно проверять есть ли строка соответствующая числу, и выводить её если есть.
http://www.cplusplus.com/reference/stl/map/
ну я читал это. и что?

пока остановился на мапе и его инициализации в начале.

Gin
27.05.2010, 14:24
Есть проблема такого характера, хотел бы чтоб с формы можно было задавать кол-во потоков в приложении использую TThread использую такое объявлений

int nThreds = StrToInt(Edit1->Text);
Thread *thr[nThreds];
for(int i=0;i<nThreads;i++){
thr[i] = new Thread(false);
}

пишет ошибку [BCC32 Error] Constant expression required

Использую как видите Builder помогитре разобраться плз

rudvil
27.05.2010, 14:30
Есть проблема такого характера, хотел бы чтоб с формы можно было задавать кол-во потоков в приложении использую TThread использую такое объявлений

int nThreds = StrToInt(Edit1->Text);
Thread *thr[nThreds];
for(int i=0;i<nThreads;i++){
thr[i] = new Thread(false);
}

пишет ошибку [BCC32 Error] Constant expression required

Использую как видите Builder помогитре разобраться плз
int nThreds = StrToInt(Edit1->Text);
Thread *thr = new Thread[nThreds];
}

Gin
27.05.2010, 15:17
2rudvil
Не не подходит твоим методом выдает то что нужно инициализировать конструктор.

Irdis
27.05.2010, 17:33
list<Thread> dd;
for (int i = 0; i < 10;i++)
{
dd.push_back(Thread(false));
}
в пень массивы, и динамическую память

STLcRash
27.05.2010, 20:13
Искал, как програмно нажать сочетание клавишь ctrl + v куча инфы, но ничго из этого не работало в моем случае.
У меня прога грузит приложение из контакта, там кроме логина и пароля от контакта, есть ещё встроенный в игру пароль, с клавиатуры в том окошке ctrl + v работает, с эмуляцией - же ничего не выходит. Подсажите как ещё можно вставить из буфера пароль в то окошко? (там не edit и не memo, а встроенное в fkash игру окошко)

M_script_
28.05.2010, 06:49
Есть проблема такого характера, хотел бы чтоб с формы можно было задавать кол-во потоков в приложении использую TThread использую такое объявлений


Написано же, используй константу.

const int nMaxThreads = 1000;
int nThreads = StrToInt(Edit1->Text);
Thread *thr[nMaxThreads];
for(int i=0;i<nThreads;i++){
thr[i] = new Thread(false);
}

qwert135
28.05.2010, 18:52
Всем привет. Проблема в следующем.
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;


void Diagonal(double **A, int NumberOfEquation) {
double *temp_massiv;
int i, j;
double max, replace;

temp_massiv = new double[NumberOfEquation];
for(i = 0;i < NumberOfEquation;i++){
max = A[i][0];
for(j = 0;j < NumberOfEquation;j++){
if(A[i][i] != 0) continue;
else{
if(A[i][j] >= max) max = A[i][j];
temp_massiv[i] = max;
}
}
}
for(i = 0;i < NumberOfEquation;i++){
for(j = 0;j < NumberOfEquation;j++){
if(A[i][j] == temp_massiv[i]){
replace = A[i][i];
A[i][i] = A[i][j];
A[i][j] = replace;
}
}
}
delete []temp_massiv;
}


int SimpleIteration(double **A, double *B, int NumberOfEquation, double *solution, double fault_input) {
int i, j, step = 1;
double *TempSolution;

TempSolution = new double[NumberOfEquation];
double fault = fault_input + 1;

for(i = 0;i < NumberOfEquation;i++) {
for(j = 0;j < NumberOfEquation;j++) {
if(i != j) {
A[i][j] = -A[i][j] / A[i][i];
}
}
B[i] = B[i] / A[i][i];
A[i][i] = 0;
}

for(i = 0;i < NumberOfEquation;i++) {
solution[i] = B[i];
}


while(fault > fault_input && step <= 1000) {
for(j = 0;j < NumberOfEquation;j++) {
TempSolution[j] = 0;
}
for(i = 0;i < NumberOfEquation;i++) {
for(j = 0;j < NumberOfEquation;j++) {
TempSolution[i] = TempSolution[i] + A[i][j]*solution[j];
}
TempSolution[i] = TempSolution[i] + B[i];
}
fault = 0.0;
for(j = 0;j < NumberOfEquation;j++) {
fault = fault + (solution[j] - TempSolution[j])*(solution[j] - TempSolution[j]);
}
fault = sqrt(fault);
for(j = 0;j < NumberOfEquation;j++) {
solution[j] = TempSolution[j];
}
step++;
}
delete []TempSolution;
return step;
}

void file_input_output(){
int i, j, row = 0, column = 0;
double **A, *B, *solution, **temp_matrix, fault_input;
char k[128];
//вычисляем размерность введенной расширенной матрицы системы
ifstream in("input_data.txt");
while(true) {
in.read(k, 1);
if(k[0] == ' ') column++;
if(k[0] == '\n'){
row++;
column++;
}
if(in.eof()){
row++;
column++;
break;
}
}
column = column/row;
in.close();
//выделяем память под матрицу коэффициентов при неизвестных
A = new double*[row];
for(i = 0;i < row;i++){
A[i] = new double[row];
}
//выделяем память под вектор свободных членов
B = new double[row];
//выделяем память под вспомогательную матрицу
temp_matrix = new double*[row];
for(i = 0;i < column;i++){
temp_matrix[i] = new double[row];
}
//выделяем память под вектор неизвестных
solution = new double[row];
//считываем матрицу во временный массив
ifstream fin("input_data.txt");
for(i = 0;i < row;i++){
for(j = 0;j < column;j++){
fin >> temp_matrix[i][j];
}
}
fin.close();
//из временного массива выбираем нужные элементы

//для матрицы коэффициентов при неизвестных
for(i = 0;i < row;i++){
for(j = 0;j < column - 1;j++){
A[i][j] = temp_matrix[i][j];
}
}
//для вектора свободных членов
for(i = 0;i < row;i++){
for(j = column - 1;j > column - 2;j--){
B[i] = temp_matrix[i][j];
}
}
Diagonal(A, row);
cout << "Введите точность вычислений: ";
cin >> fault_input;
int steps = SimpleIteration(A, B, row, solution, fault_input);
if(steps > 1000) {
cout << "Ошибка!!! Возможные причины:\n";
cout << "1)Слишком большое количество итераций.\n";
cout << "2)Какие-либо строки(столбцы) линейно зависимы.\n";
}
else {
ofstream out("solution.txt");
out << "Решение СЛАУ:\n";
for(j = 0;j < row;j++) {
out << solution[j] << "\n";
}
out << "Количество итераций: " << steps;
cout << "Результат вычислений записан в файл 'solution.txt'.\n";
out.close();
system("solution.txt");
}
//очищаем выделенную память, здесь все нормально
for(i = 0;i < row;i++) {
delete []A[i];
}
delete []A;
delete []B;
delete []solution;
//а вот на этом месте,при очистки памяти выделенной под временный
//массив, прога при работе выдает ошибку(компилится все норм)
for(i = 0;i < column;i++){
delete []temp_matrix[i];
}
delete []temp_matrix;
}

int main() {
cout << "Данная программа предназначена для решения СЛАУ методом простых итераций.\n";
file_input_output();
system("pause");
return 0;
}

Вот сама ошибка, среда VS2010.
Debug Assertion Failed!
...
Expression:_CrtIsValidHeapPointer(pUserData)
...
Плиз, помогите разобраться что не так, просто раньше норм все работало, а щас че т не хочет.

Linkus
28.05.2010, 19:20
Плиз, помогите разобраться что не так, просто раньше норм все работало, а щас че т не хочет.

приведи пример входного файла

qwert135
28.05.2010, 19:45
10 1 1 12
2 10 1 13
2 2 10 14
Все элементы записаны через пробел, лишних нет(пробелов).Количество сторок и столбцов в функции file_input_output() вычисляется верно, проверял.И, кстати, когда открывается файл "solution.txt" решение в нем верное записано.
P.S. какими функциями можно проверить состояние памяти, как например MemAvail и MaxAvail в паскале?

Linkus
28.05.2010, 20:11
а какую точность вводить? вроде считает, результаты выводит, но по закрытию пишет что куча повреждена)) у меня VS 2008 TS

qwert135
28.05.2010, 20:19
а какую точность вводить? вроде считает, результаты выводит, но по закрытию пишет что куча повреждена)) у меня VS 2008 TS
Вот таже хрень, точность можно любую, к тому примеру, который я написал, достаточно 0.0001 , и прога выдаст точное решение (1 1 1).Можно конечно убрать
for(i = 0;i < column;i++){
delete []temp_matrix[i];
}
delete []temp_matrix;
и все будет норм работать, но хотелось разобраться, да и память замусоривать нехорошо))
Вот блин, ща попробовал в CodeBlocks скомпилить и запустить, и о чудо, там все норм.

Irdis
28.05.2010, 20:25
temp_matrix = new double*[row];
for(i = 0;i < column;i++){
temp_matrix[i] = new double[row];
}

это бред если column!=row

qwert135
28.05.2010, 20:30
это бред если column!=row
Пробовал, тоже самое.Кстати,еще вот это сообщение VS выводит
Windows has triggered a breakpoint in SLAU.exe.

This may be due to a corruption of the heap, which indicates a bug in SLAU.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while SLAU.exe has focus.

The output window may have more diagnostic information.

qwert135
28.05.2010, 20:32
это бред если column!=row
Сори, не туда посмотрел, ту ты прав. Все равно таж ошибка.

Irdis
28.05.2010, 20:39
разберитесь где у вас column а где row...
я пытался понять, но сложилось такое впечатление, что они перепутаны в каждой второй строке.
вот кстати как делаются матрицы:

temp_matrix = new double*[row];
for(i = 0;i < row;i++){
temp_matrix[i] = new double[column];
}

for(i = 0;i < row;i++){
delete [] temp_matrix[i];
}
delete [] temp_matrix;

qwert135
28.05.2010, 20:40
Все, разобрался.Спасибо всем за помощь. У меня получалась матрица(в примере) 3х4, а я выделял память для 4х3))).Тогда следующий вопрос-почему CodeBlocks эт пропустил?))

qwert135
28.05.2010, 20:44
разберитесь где у вас column а где row...
я пытался понять, но сложилось такое впечатление, что они перепутаны в каждой второй строке.
вот кстати как делаются матрицы:
Особенно большое СПАСИБО
P.S. какими функциями можно проверить состояние памяти, как например MemAvail и MaxAvail в паскале?

Besi
28.05.2010, 21:55
посоветуйте книгу(с++) потоки и сети можно 2 разные книги)
буду благодарен

WNZRS
28.05.2010, 22:50
Как лучше организовать потоки в бруте: 1 поток = 1 пароль, 1 поток = 10 паролей или др?

И можно ли передать потоку 2 параметра (структуры использовать не хочется)?

PS: брут серверов

BrainDeaD
28.05.2010, 23:37
ну уж точно не 1 поток на 1 пароль. так у тебя поток может создаваться дольше чем идёт проверка одного пасса. всё зависит от скорости. делай значение переменным и пробуй изменять. смотри как прога реагирует. лично я бы так делал.

M_script_
29.05.2010, 09:50
И можно ли передать потоку 2 параметра (структуры использовать не хочется)?
Можно, если использовать TThread из VCL или написать свой класс для работы с потоками.

STLcRash
29.05.2010, 11:56
procedure klickkor(korX:integer;korY:integer); // p - пауза в секукндах var Pt: TPoint; begin Pt.x := korX; Pt.y := korY; {Преобразуем Pt к координатам экрана} Pt := ClientToScreen(Pt); {Преобразуем Pt к "mickeys" (аболютным координатам курсора мышки} Pt.x := Round(Pt.x * (65535 / Screen.Width)); Pt.y := Round(Pt.y * (65535 / Screen.Height)); {Переместим курсор мыши} Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0); {Имитируем нажатие левой кнопки мыши} Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0); {Имитируем отпускание левой кнопки мыши} Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0); end;
однако вылазит ошибка
Unit1.pas(225): Incompatible types: 'HWND' and 'TPoint
Что я не так делаю?

Ra$cal
29.05.2010, 15:37
название топика читаешь криво

qwert135
30.05.2010, 11:15
Народ, переведите плиз следующий код из С++ на С, а именно потоковый вывод через printf(), заранее спасибо.
//N101
#include <iostream.h>
#include <conio.h>

int main()
{ int i,j,k1,k2,n;
n=10000000 ;//до какого числа считать
cout << "Numbers(less then 1000000), the sum of numbers of which is divided on 7.\n\n";
for (i=2;i<n;i++){
j=i+1;
k2=0;
while (j>0){
k2+= j%10;
j/=10;
}
if (k1%7==0 && k2%7==0){
cout << "Number is: ";
cout << i << "\n";
}
k1=k2;
}
cout << "\n";
getch();
return 0;
}

Ins3t
30.05.2010, 13:47
//N101
#include <stdio.h>

int main()
{
int i, j, k1, k2, n;
n = 10000000 ;
printf( "Numbers(less then 1000000), the sum of numbers of which is divided on 7.\n\n" );

for ( i = 2; i < n; i++ )
{
j = i + 1;
k2 = 0;

while( j > 0 )
{
k2 += j % 10;
j /= 10;
}

if ( k1 % 7 == 0 && k2 % 7 == 0)
{
printf( "%s: %d \n", "Number is", i );
}

k1 = k2;
}
printf( "\n" );
getch();
return 0;
}


Но сразу скажу, что твой код не корректен.

qwert135
30.05.2010, 15:08
Ins3t Да эт не мой код, спасиб за помощь.

rudvil
30.05.2010, 19:03
Взято из примеров boost'a.
Функции чтения текстовых файлов.#include <iostream>
#include <fstream>
#include <string>

///////////////////////////////////////////////////////////////////////////////
// Helper function reading a file into a string
///////////////////////////////////////////////////////////////////////////////
inline std::string
read_from_file(char const* infile)
{
std::ifstream instream(infile);
if (!instream.is_open()) {
std::cerr << "Couldn't open file: " << infile << std::endl;
exit(-1);
}
instream.unsetf(std::ios::skipws); // No white space skipping!
return std::string(std::istreambuf_iterator<char>(instream.rdbuf()),
std::istreambuf_iterator<char>());
}
Чем boost'овский вариант лучше(правильней?), чем скажем этот?std::string read_from_file(char const* infile) {
std::ifstream instream(infile);
if (!instream.is_open()) {
std::cerr << "Couldn't open file: " << infile << std::endl;
exit(-1);
}
std::string str;
std::getline(instream, str, '\0');
return str;
}
Понятное дело там(в boost'e) что попало не пишут и раз делают так, то скорее всего так лучше(правильней?), хочется узнать из за-чего и почему.

SHAXID
30.05.2010, 20:15
Подскажите, пожалуйста, как на языке паскаля записать вот эти формулы:

y=корень квадратный(1-0,1sin^2 фи)

y=log(5снизу)х / корень квадратный(x) - 1

rudvil
30.05.2010, 20:22
Подскажите, пожалуйста, как на языке паскаля записать вот эти формулы:

y=корень квадратный(1-0,1sin^2 фи)

y=log(5снизу)х / корень квадратный(x) - 1
Прочитай название темы, только внимательно!

t4Nk
30.05.2010, 21:11
rudvil, а где буст? Тут только stl вижу.
Если заглянуть в код std::getline то поймешь, что
примеры практически идентичные, пользуйся каким удобнее.

rudvil
30.05.2010, 21:28
rudvil, а где буст? Тут только stl вижу.
Если заглянуть в код std::getline то поймешь, что
примеры практически идентичные, пользуйся каким удобнее.
Я про другое =]
Про то - что в своих примерах разных библиотек "boost_1_43_0/libs/libname/example/"...
они используют эту функцию, для чтения текстовых файлов, собственно и стало непонятно и интересно, в чем их функция обыгрывает тот пример что я писал выше?

.::f-duck::.
02.06.2010, 16:18
Необходимо программно запустить cmd.exe и также программно выполнить в ней определенную операцию,например, CD C:\
Как такое сделать?

Ins3t
02.06.2010, 16:27
system( "cd dir" );

Smapt
08.06.2010, 11:39
В c++builder
есть например такой код:



TIdHTTP *IdHTTP1;

void __fastcall TForm1::IdHTTP1Connected(TObject *Sender)
{
///bla-bla-bla
}



можно ли по аналогии сделать обработку такого события для массива обьектов TIdHTTP, заданных вот так:



TIdHTTP *IdHTTP[100];

M_script_
08.06.2010, 12:28
можно ли по аналогии сделать обработку такого события для массива обьектов TIdHTTP.

Можно. В цикле всем объектам присваивай один обработчик.

Smapt
08.06.2010, 12:35
Можно. В цикле всем объектам присваивай один обработчик.

делаю вот так:


TIdHTTP * http;


void __fastcall IdHTTPConnected(TObject *Sender)
{
//bla-bla-bla
}

http->OnConnected = IdHTTPConnected;



на что оно ругается:

E2034 Cannot convert 'void (_fastcall *)(TObject *)' to 'TNotifyEvent'

я понимаю что не соответствие типов, но как это все "согласовать" не знаю)

ktotikyc332
10.06.2010, 07:19
а вот у меня вопрос!!я щяс буду выглядить дибилом))я написал наипростейщуюпрогу на C++ в Microsoft Visual C++ 2008 Express Edition а как посмотреть действие программы тоесть я сделал прогу а терь её включить как?)))) :D :D :D :D :confused: :confused: я прогу взял из учебника




#include <iostream> int main() { cout<<"Hellow, World!\n"; return 0; }

M_script_
10.06.2010, 08:58
Smapt, примерно так:

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
for(int i = 0; i < 100; ++i)
{
http[i] = new TIdHTTP(NULL);
http[i]->OnConnected = IdHTTP1Connected;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdHTTPConnected(TObject *Sender)
{
return;
}
//---------------------------------------------------------------------------

оlbaneс
10.06.2010, 11:42
а вот у меня вопрос!!я щяс буду выглядить дибилом))я написал наипростейщуюпрогу на C++ в Microsoft Visual C++ 2008 Express Edition а как посмотреть действие программы тоесть я сделал прогу а терь её включить как?)))) :D :D :D :D :confused: :confused: я прогу взял из учебника




#include <iostream> int main() { cout<<"Hellow, World!\n"; return 0; }
ф10. изучи строку меню

[FREE]
10.06.2010, 15:11
ребята нужно написать программу на с++ forms
Не сложная, пару часов работы, кто может помочь напишите 1331316, хорошо заплачу

bipolar
11.06.2010, 17:07
подскажите, как добавить свой файл (rect.h, rect.cpp) в проект с++, VS 2008?
ps когда пишу #include "rect.h" - error LNK2019: ссылка на неразрешенный внешний символ

разобрался!
помимо того чтоб указать #include "rect.h", нужно еще добавить файлы *.h, *.cpp в "обозревателе решений"

Grek
13.06.2010, 20:28
Народ подкинте литературку о функциях для работы с файлами.
Открытие/закрытие
Редактирование/Чтение из файла
Копирование/Переименование/Удаление
размер/дата создания файла и прочая инфа.

Весь гугл истоптал.

rudvil
13.06.2010, 20:33
Весь гугл истоптал.
только врать не надо =]

http://www.cplusplus.com/doc/tutorial/files/
http://doc.trolltech.com/4.6/qfile.html
http://doc.trolltech.com/4.6/qfileinfo.html
http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm

Grek
13.06.2010, 20:35
только врать не надо =]

http://doc.trolltech.com/4.6/qfile.html
http://doc.trolltech.com/4.6/qfileinfo.html
http://www.cplusplus.com/doc/tutorial/files/
http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm

Честное пионерское))Просто на русском искал-одни форумы
ЗЫ
Спасибо

Grek
13.06.2010, 21:24
Вобщем программа

#include <vcl.h>
#include <iostream>
#include <windows>
#pragma hdrstop
#pragma argsused
using namespace std;
//----------------------
int main()
{
char str[20];
struct user
{
char name[20];
char nick[20];
char email[20];
int icq;
}userdata;
CharToOem("Введите имя\n",str);
cout << str;
cin >> userdata.name;
//--------------------------
CharToOem("Введите ник\n",str);
cout << str;
cin >> userdata.nick;
//---------------------------
CharToOem("Введите Email\n",str);
cout << str;
cin >> userdata.email;
//----------------------------
CharToOem("Введите icq\n",str);
cout << str;
cin >> userdata.icq;
//----------Вывод
cout << "\n**********\n";
cout << userdata.name << "\n" <<userdata.nick << "\n" << userdata.email << "\n" << userdata.icq << "\n-----------\n";

FILE *fp;
fp=fopen("c:\\user.txt","wt");
fprintf (fp,"%name%nick%email%icq",userdata.name,userdata.nick,userdata.email,userda ta.icq);
fclose(fp);
system("pause");
}

Фишка в чем,члены структуры выводятся нормально,но при записи в файл забивает мусор.Не соответствие типов?

Irdis
13.06.2010, 21:30
Grek
смотрим на const char * format
и для чего он нужен
http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/

rudvil
13.06.2010, 21:41
2Grek мешать С++ с Си не хорошо
#include <iostream>
#include <locale>
#include <fstream>
#include <string>

struct user {
std::string name;
std::string nick;
std::string email;
int icq;
};

int main(int argc, char* argv[]) {
std::setlocale(LC_ALL, "Russian");

user userdata;

std::cout << "Введите имя\n";
std::cin >> userdata.name;

std::cout << "Введите ник\n";
std::cin >> userdata.nick;

std::cout << "Введите Email\n";
std::cin >> userdata.email;

std::cout << "Введите icq\n";
std::cin >> userdata.icq;

std::ofstream file("C:\\user.txt");

file << "name:" << userdata.name << "\n";
file << "nick:" << userdata.nick << "\n";
file << "email:" << userdata.email << "\n";
file << "icq:" << userdata.icq;

file.close();
system("pause");
}

вот так точно будет работать.

Grek
13.06.2010, 21:47
2Grek мешать С++ с Си не хорошо
#include <iostream>
#include <locale>
#include <fstream>
#include <string>

struct user {
std::string name;
std::string nick;
std::string email;
int icq;
};

int main(int argc, char* argv[]) {
std::setlocale(LC_ALL, "Russian");

user userdata;

std::cout << "Введите имя\n";
std::cin >> userdata.name;

std::cout << "Введите ник\n";
std::cin >> userdata.nick;

std::cout << "Введите Email\n";
std::cin >> userdata.email;

std::cout << "Введите icq\n";
std::cin >> userdata.icq;

std::ofstream file("C:\\user.txt");

file << "name:" << userdata.name << "\n";
file << "nick:" << userdata.nick << "\n";
file << "email:" << userdata.email << "\n";
file << "icq:" << userdata.icq;

file.close();
system("pause");
}

вот так точно будет работать.

учебники просто разные,сборная CCCP ))

Спасиб всем.Разобрался почуть.

Ra$cal
14.06.2010, 03:13
Grek
ну и в довесок - не юзай using namespace std. если хочется упростить - делай

using std::cin;
using std::cout;
using std::string;
using std::ofstream;

юзанье всего неймспейса - моветон.

qwert135
14.06.2010, 21:32
Grek
ну и в довесок - не юзай using namespace std. если хочется упростить - делай

using std::cin;
using std::cout;
using std::string;
using std::ofstream;

юзанье всего неймспейса - моветон.
Сори за глупый вопрос, но почему using namespace std нехорошо?

Ra$cal
14.06.2010, 21:50
потому что могут перекрыться классы в неймспейсах, например будет класс string из stl, и класс string от стороннего поставщика с гораздо большим функционалом, например в неймспейсе megalib. Если заюзить неймспесы std и megalib будет конфликт. Так же если вы не заюзали стд, а заюзали megalib, то при использовании объявления string наверняка большинство будет думать о классе стринг из std. То же самое будет и с самим разработчиком через некоторое время. То есть теперь надо будет думать, а откуда этот класс взят. Ну и плюс все что объявлно в неймспейсе становится видимо глобально. Поэтому и не рекомендуют так делать.

И да, все юзинги писать надо в cpp файлах, а не в хидерах.

qwert135
14.06.2010, 23:10
Все понятно.Спасибо.

mailbrush
17.06.2010, 12:52
recv(s, response, 1024, 0);
Этим кодом я получаю 1024 байта и записываю их в response.
Как получить абсолютно всю информацию, предварительно не зная сколько байтов, и записать все это в один массив символов?

do
{
iResult = recv(s, response, 1024, 0);
}
while(iResult > 0);


Этим кодом получается вся информация, но проблема в том, что в response оказываются последние 1024 байта, что очевидно. Необходимо как-то создать буфер неизвестной длины, и в цикле делать конкатенацию буфера вместе с полученной инфой, но как?

Еще как вариант - создать динамический массив, и в цикле расширять его размер, опять вопрос - как?

Спасибо заранее.

d_x
17.06.2010, 13:08
string answer;

while( (iResult = recv(s, response, 1024, 0)) > 0)
answer.append(response, iResult);

//весь ответ в answer.c_str()

Если нуллбайты будут в ответе, то такой способ скорее всего не подойдет.

herfleisch
17.06.2010, 13:33
recv(s, response, 1024, 0);
Этим кодом я получаю 1024 байта и записываю их в response.
Как получить абсолютно всю информацию, предварительно не зная сколько байтов, и записать все это в один массив символов?

do
{
iResult = recv(s, response, 1024, 0);
}
while(iResult > 0);


Этим кодом получается вся информация, но проблема в том, что в response оказываются последние 1024 байта, что очевидно. Необходимо как-то создать буфер неизвестной длины, и в цикле делать конкатенацию буфера вместе с полученной инфой, но как?

Еще как вариант - создать динамический массив, и в цикле расширять его размер, опять вопрос - как?

Спасибо заранее.

Храни строки в списке, а не в массиве. Например, принимаешь по 1024 символа.

Собственно список - это и есть какое-то подобие динамического массива.

Тогда кодишь так:
struct info
{
info * next; // Указатель на след. элемент
info * prev; // и на предыдущий
char data[1024];
} node;

...

recv(s, node.data, 1024, 0);

/*
В классе хранишь указатели на первую принятую строку. Далее раотаешь с объектом.
*/

...


Далее можно написать класс, реализующий линейный двусвязный список, нафигачить ему конструкторы копирования всякие, перегрузку выражений и т.д.

POS_troi
17.06.2010, 13:33
Посоветуйте какую нить приблуду для парсинга XML и ini. Желательно чтобы обвертки поменьше катать нужно было.