トップページ⇒tech
1001コメント288KB

【初心者歓迎】C/C++室 Ver.13【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。

【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (dat落ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(dat落ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(dat落ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/(dat落ち)
9:http://pc5.2ch.net/test/read.cgi/tech/1094494997/l50
10:http://pc5.2ch.net/test/read.cgi/tech/1097416187/
11:http://pc5.2ch.net/test/read.cgi/tech/1099190154/
12:http://pc5.2ch.net/test/read.cgi/tech/1101100031/
【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

関連スレは>>2-5ぐらい
0153デフォルトの名無しさんNGNG
>>152
諦めましょう。
0154デフォルトの名無しさんNGNG
>>152
モチツケ。そしてEffectiveSTLを読んでみろ。
エラーの解読方法が書いてある。
0155デフォルトの名無しさんNGNG
amazon見たら星5個ですね
わかりました紀伊国屋いってきます
0156デフォルトの名無しさんNGNG
>>155
その項だけ立ち読みすればいいと思われ
ていうか、ただ「似てる部分はまとめろ」ってだけだけど
0157デフォルトの名無しさんNGNG
なるほど財布持たずに勉強だけしに行くことにします
0158デフォルトの名無しさんNGNG
本ぐらい買え
0159デフォルトの名無しさんNGNG
int main(int argc, char *argv[]){
FILE *fp;
char keyword[80];
char line[256];
char* sp;
int size = 0;

if( argc<3 || (fp=fopen(argv[1],"r") ) == NULL){
printf("can not open file");
exit(1);
}
strcpy(keyword,argv[2]);
size = strlen(keyword);

while(fgets(line,256,fp) !=NULL){
sp = strncmp(line,keyword,size);
if(sp==0){
printf("%s",line);
}
}

fclose(fp);
return 0;
}

----------------------------------------------------------------------
文字列処理のプログラムなんですが、keywordが1文字だった場合、
keywordに空白を追加して文字列比較(strncmp)の処理を行いたいのです。
どのようにすればよいでしょうか?
0160デフォルトの名無しさんNGNG
>159
sizeが1だったらstrcatで" "を追加。動作はデバッグして調べよ
0161デフォルトの名無しさんNGNG
>>159
○痴かよド畜生が!
0162 NGNG
#include<stdio.h>
main()
{
   char name[7] = {"NURUPO"};
   char *add;
   int i;

   add=name;

   for(i=0; i<6; i++){
printf("%Xは文字%cを表している。\n",add,*add);
add++;
}
   printf("\n");
   printf("逆に並べ替えると\n");
   for(i=5; i>=0; i--){
       printf("%Xは文字%cを表している。\n"      );

   }
}

NURUPOを反転表示させたいのですが、どのようにすればいいでしょうか?
0163デフォルトの名無しさんNGNG
#include<stdio.h>
main()
{
    char name[] = "NURUPO";
    char *add = name;
    int i;
    for (i = 0; i < 6; i++) {
        printf("%Xは文字%cを表している。\n", add, *add);
        add++;
    }
    printf("\n逆に並べ替えると\n");
    for (i = 5; i >= 0; i--) {
        printf("%Xは文字%cを表している。\n", add, *add);
    }
}
0164デフォルトの名無しさんNGNG
#include <stdio.h>
#include <string.h>
#include <algorithm>

int main()
{
char name[] = "NURUPO";
printf("%s\n", name);
std::reverse(&name[0], &name[strlen(name)]);
printf("%s\n", name);

return 0;
}
0165デフォルトの名無しさんNGNG
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::puts;
int main()
{
  char name[] = "NURUPO";
  puts(name);
  std::reverse(name, name + strlen(name));
  puts(name);
  return 0;
}
0166デフォルトの名無しさんNGNG
おぷるん
0167デフォルトの名無しさんNGNG
int* func(){ 処理 }
という関数を実行したとき返り値を必ずどこかに格納しなくてもいいんでしょうか?


例
int* a = func(); を func();だけにする。
0168デフォルトの名無しさんNGNG
func()が新しく確保して開放していないメモリへのポインタを返して
いなければ構わないよ。
0169デフォルトの名無しさんNGNG
>>168
言い方悪くない?

>>167
そのポインタが指すオブジェクトを、
呼び元が解放しなければならない場合は駄目。
そうでなければ構わないよ。
0170デフォルトの名無しさんNGNG
printfやstrcpyの返り値を利用する割合は、全体の2.4%(当社調べ)
0171デフォルトの名無しさんNGNG
>168-169
解決しました。レスありがとうございます
0172デフォルトの名無しさんNGNG
fseek()の返り値は更に使われない悪寒。
0173デフォルトの名無しさんNGNG
こんちわ、ある関数の
if(search_flug == 0){//もしもsearch_flug=0ならば新ノード作成
New_nord = (struct word *)malloc(sizeof(struct word));//そのノードの次ノードを作って。
strcpy(New_nord -> name,word_name);//単語を登録
(New_nord -> appear)++;//出現回数に1を加算
New_nord -> Next_pt = NULL;//Next_ptをNULLに(次がないんだからネ)
Now_nord -> Next_pt = New_nord;//んで、さっきまでNULLだったノードのNext_ptを新ノードへのポインタに
}
else{
(Now_nord [hash_num].appear)++;
}
という所で、一番頭の
if(search_flug == 0){
の所で構文エラーが出るのですが。
原因がわかりません。
全角文字を使ってるとか、{}の数が足りてないとかスペルミスとか色々試してみたがどうも
ピンと来ないのですが、わかる方ご教授お願いします。
この記述の直前にdo whileでループを書いてるんですが、それとか関係ないですよね・・・?

コンパイラはVC++6.0です。
0174デフォルトの名無しさんNGNG
おわーあ、表示崩れてる
すいませんッ
0175デフォルトの名無しさんNGNG
flugだとかnordだとか突っ込みどころだらけだなぁ、おい。
構文エラーが出たならエラーの内容くらい書いとけ。
0176デフォルトの名無しさんNGNG
ゆとり教育の成果だな
0177デフォルトの名無しさんNGNG
ある意味表示崩れてるな。
0178デフォルトの名無しさんNGNG
あ、ホントだスペルちゃいますね。
直しておきます。失礼!

エラーなんですが
error C2059: 構文エラー : 'if'
とだけで、自分もかなり面食らってます
0179デフォルトの名無しさんNGNG
>>178
前をもそっと
0180デフォルトの名無しさんNGNG
あが〜、一度寝てからコードを見直したら原因がわかりました。
どうも申し訳ございませんでしたっ!

なんか鬱です。ごめんなさい。
0181デフォルトの名無しさんNGNG
その前の行でセミコロンが抜けてたとか。
0182デフォルトの名無しさんNGNG
WindowsXP
Visual Studio .Net
C++

以上の環境で、MFC、Win32API、ATL、C標準関数なんでもござれなアプリを作る予定です。
(MFCとWin32APIの違い等もよく理解していないのが正解だが)
ダイアログベースで、ダイアログ内にJPEG画像を縮小して20枚くらいサムネイルのように貼り付け
クリックされたら拡大表示っていうふうなアプリを作ろうと思っているんです。

そこで質問です。JPEG画像を縮小表示してダイアログに貼り付ける場合、どのように描画するのが
よいのでしょうか。

俺のつたない予想
�@ ダイアログのOnPaintでCBitmapを描画
�A CImageで描画
�B 自分自身に描画するクラスを作って20個貼り付ける?
�C CBitmapButtonで貼り付ける?
0183デフォルトの名無しさんNGNG
>>182
サムネイルならリストコントロール使えばいいだろ
0184182NGNG
リストコントロール!!
その手がありましたか。エクスプローラの縮小表示のようにするってことですね。

これはかなり効果的でしたが、情報の後だしと言われてしまいますが
表示する20個はある条件にソートされて表示したいんで、
今回は使えませんでした。

ちょっともう少し自分で調べてみることにします。
0185デフォルトの名無しさんNGNG
>>184
リストコントロールは独自のソートできるよ。
0186デフォルトの名無しさんNGNG
void (*pKeyFunc[])() = {this->KeyBoardEvent_Field, this->KeyBoardEvent_FieldMenu, NULL};
ってムリ?
0187186NGNG
ムリだから質問したんでした。。。
どう改良すればコンパイルできます?
switchにするしかないのかな
0188デフォルトの名無しさんNGNG
>>186
こう?
void (クラス名::*pKeyFunc[])() =
0189186NGNG
>>188 ありがと。

void (ClassA::*pKeyFunc[3])() = {ClassA::KeyBoardEvent_Field, ClassA
:KeyBoardEvent_FieldMenu, NULL};
(this->*pKeyFunc[m_iMD])();
で解決しました。でも、何故これでOKなのか理解でき(ry...
0190デフォルトの名無しさんNGNG
>>189
名前空間
0191デフォルトの名無しさんNGNG
>>189
メンバ関数へのポインタ。
規格では &ClassA::KeyBoardEvent_Field のように & が必須なのでつけたほうがいい。

>>190
関係無い。
0192デフォルトの名無しさんNGNG
>>191
名前空間が解決できないからクラス名を指定しているんじゃないの?
0193186NGNG
(pKeyFunc[i])()も
(*pKeyFunc[i])()も
(ClassA::*pKeyFunc[i])();も
(ClassA::pKeyFunc[i])();もダメ。
this限定で、「*」(C言語ではいらなかったはず)を付けないと
いけないのかが分かりません。
ClassA::じゃ名前空間、物足りませんか...
0194デフォルトの名無しさんNGNG
>>192 ちがうよ。
>>193 "->*" がひとつの演算子。
0195デフォルトの名無しさんNGNG
neonをつかいWebDAV関連のプログラムを作りたいのですが、プログラムをうまくコンパイルすることができません。
neonのホームページは下の所です。
ttp://www.webdav.org/neon/
開発環境はLinuxを使ってます。
以下のサンプルコードをコンパイルしようとした所次のようなエラーがでました。
#include<ne_session.h>
int main()
{
ne_session *sess;
sess=ne_session_create("http","ServerName",80);
ne_session_destroy(sess);
return 0;
}
gcc -L/usr/local/lib -I/usr/local/include/neon sample.c
/tmp/ccunwT5A.o(.text+0x18): In function `main':
: undefined reference to `ne_session_create'
/tmp/ccunwT5A.o(.text+0x25): In function `main':
: undefined reference to `ne_session_destroy'
collect2: ld はステータス 1 で終了しました
と上記のようなエラーがでてしまいます。
因みにne_session_createとne_session_destroyはne_session.hをインクルードすれば使えるはずなのですが。。。
#include <ne_session.h>
ne_session *ne_session_create(const char *scheme, const char *hostname, unsigned int port);
void ne_session_proxy(ne_session *session, const char *hostname, unsigned int port);
void ne_close_connection(ne_session *session);
void ne_session_destroy(ne_session *session);
コンパイラーに渡すオプション何か足りないものがあるのでしょうか?
教えて下さい。
0196デフォルトの名無しさんNGNG
>>195
インクルードファイルのディレクトリは-I/usr/local/include/neonで指定してるのに、
ライブラリは-L/usr/local/libなのか?
ホントにそのディレクトリにライブラリが入ってるのかどうか確かめてみては?
0197Rubyist!NGNG
普通にインストールすればneon-configかpkg-config用の*.pcファイルも入っているはずだから
gcc sample.c `neon-config --cflags --libs`
か
gcc sample.c `pkg-config neon --cflags --libs`
とでもすればいい。
0198デフォルトの名無しさんNGNG
>>197
>>197
>>197
>>197
>>197
>>197
>>197
>>197
>>197
知ったか発見!!!!!!!!!!
0199Rubyist!NGNG
>インクルードファイルのディレクトリは-I/usr/local/include/neonで指定してるのに、
>ライブラリは-L/usr/local/libなのか?
突っ込むところはそこじゃなくて-lneonとを指定していないことだろ。
0200195NGNG
Rubylist!さんありがとうございます。
おかげでコンパイルできました。
0201デフォルトの名無しさんNGNG
最近Cの方を始めたのですが
#include<stdio.h>

main()
{
printf("表示する文字\n");
}
とありますがコマンドプロントがすぐに閉じてしまいますそれを閉じないようにするにはどこに何を加えればよいでしょうか?初歩的質問すみません。

0202デフォルトの名無しさんNGNG
>>199
>>199
>>199
>>199
>>199
>>199
>>199
>>199
>>199
知ったか発見!!!!!!!!
0203デフォルトの名無しさんNGNG
>201
puts("プログラム終了。Enterキー押せよ");
getchar();
か
system("pause");
0204デフォルトの名無しさんNGNG
ありがとうございました。さっそく試して見ます。
0205デフォルトの名無しさんNGNG
試してから書け
0206デフォルトの名無しさんNGNG
すみませんでした。教えてもらったのに・・・・・・
ちゃんとコンパイルもできいけました。本当にありがとうございます。
0207デフォルトの名無しさん05/01/17 14:10:45
C++のプログラムで、
if ( (p.coef = d_ALC(p.ele)) == NULL )ERR("p.coef");
のような行があったんですが、ここにでてくる、「ERR」ってなんでしょうか?
0208デフォルトの名無しさん05/01/17 14:13:00
ソースとヘッダ検索しろよ
基本的にC/C++はそれでシンボルの問題は解決するぞ
0209デフォルトの名無しさん05/01/17 17:19:37
すごく既出かもしれませんが、なかなか検索しても引っかからないので、
すいませんがお教え下さい。

複数ファイル間でnamespace使う場合、
[ファイルA]
namespace ns{int b;}
とだけして、
[ファイルB]で
namespace ns{int c;}
int main(){......return 0;}
と記述したのですが、[ファイルB]でint bを参照する場合、
using namespace ns;
extern int b;
ではダメみたいなのですが、どうすれば良いのでしょうか?
0210デフォルトの名無しさん05/01/17 17:30:26
>209
なぜ共通ヘッダを使わない?
namespace ns;
extern int ns::b;
0211デフォルトの名無しさん05/01/17 17:35:26
>210
ご回答ありがとうございます。
共通ヘッダを使うべきなのでしょうが、
「複数ファイル間で同名のnamespaceが同じ名前空間で扱われるか」
を試そうと思っていましたので共通ヘッダを使用しませんでした。
>namespace ns;
>extern int ns::b;
とありますが、どうもコンパイルエラーになるようです。
環境はg++3.3.2です。
021220905/01/17 17:40:52
またソースは以下のとおりです。
[ファイルA]
namespace ns{int b;}
[ファイルB]
#include <iostream>
using namespace std;
namespace ns{int c=100;}
int main(){
using namespace ns;
extern int ns::b;
cout<<c<<endl;
return 0;
}
で、エラーは以下です。
error: `ns::b' should have been declared inside `ns'
021320905/01/17 17:43:32
int b;はファイルAのnamespaceのスコープでさえぎられているのでしょうか?
0214デフォルトの名無しさん05/01/17 17:55:42
namespace ns{int c =100;}
namespace ns{extern int b;}
int main(){/*...*/}
とするべき。
一般に名前空間に(その翻訳単位で)新しい名前を追加するときは
名前空間をオープンしないといけない。
0215デフォルトの名無しさん05/01/17 17:55:49
コンパイル単位Aに宣言かつ定義されたns::bを外部のコンパイル単位Bから参照しようとしてるなら、usingの前に何かを書かねば…
021620905/01/17 18:05:50
>214
おお!素晴しいです。できました!なるほど。
このテストをやってみたのは、複数のファイルで
using namespace std;
ってやってる場合、それらは同じ名前空間だけど、共通の空間として
認識されてるのか(もしくはそれぞれのファイル単位で別物のstdなのか)
を確認したかったからです。
>namespace ns{extern int b;}
とすることで、ファイルAの名前空間nsを参照できてるってことですかね。

>215
externとか書いてみたんですが、文法がおかしいみたいでした。。。
よくわからなかったもので。
0217デフォルトの名無しさん05/01/17 18:12:32
>216
usingは、ns::を省略するぐらいの意味。externは外部(external)という意味。
021820905/01/17 18:18:32
ありがとうございました!
0219デフォルトの名無しさん05/01/17 20:38:14
winscokを使ったクラスを作るために設計したんですが。
ただのラッパーみたいになってしまいます。
これは設計が悪いからでしょうか?
0220デフォルトの名無しさん05/01/17 20:43:27
>219
常に決められた手順通りに動くことを想定すれば、途中の事務処理は自動化できるはず。
022121905/01/17 22:20:09
>>220
常に決められた手順は、そのクラスから派生して作るものかなと
思ったりしてるんですが、

そこまで考えてクラス設計はしなくても良いもんなんでしょうか?
それだけにしか使えないクラスを作成するとか。

クラスってイメージは、鯛焼きの型ってイメージがあるんで
専用クラス作るのは良いことじゃないと思ってるんです。
0222デフォルトの名無しさん05/01/17 22:39:56
>>221
常に決められた手順だから、
クラスとしてまとめるんだろ?
そのクラスを使う上位で、
同じ事を何度も書かなくても言いように。
022322205/01/17 22:41:03
>>222
×言いように
○いいように

orz
022421905/01/17 23:23:46
何度も宣言しないなら、クラスにしなくても良いじゃないかな?
と思ってしまうんですよね。

クラスは、どんなときに使うのか?を理解する必要があるみたいです。
良い本を読んでみます。
0225デフォルトの名無しさん05/01/17 23:30:36
boostのtokenizerで文字列を単語に分割したいんですが、
「aa<?bbcc?>dd」という文字列を、「aa」「bbcc」「dd」に
分割するようなことは出来ないのでしょうか。
ちょっと調べたんですが、1文字でしか分割できないような気がします。

それと、<??>の内部か外部かを判断するのは出来ますか?
0226デフォルトの名無しさん05/01/17 23:54:00
boost::regexの方が簡単じゃないか?
0227デフォルトの名無しさん05/01/18 00:04:58
ネストを許すかどうかで最適解が変わるんじゃないか
0228デフォルトの名無しさん05/01/18 01:24:49
ネストを許すならパーサを書くかboost::spirit。許さないならboost::regex。
0229デフォルトの名無しさん05/01/18 08:04:50
許さないのでregexにします。
ありがとうございました。
0230デフォルトの名無しさん05/01/18 12:39:46
>>221
>常に決められた手順は、そのクラスから派生して作るものかなと
>思ったりしてるんですが、

>>219 の winscok を使ったクラスを例に考えてみよう。
例えば、藻前は上位クラスでコネクションを行う必要がある度に、
わざわざ、

 ・アドレス解決メソッド
 ・socket() ラッパーメソッド
 ・connect() ラッパーメソッド

と、複数のメソッドを呼ばそうとするのか?

普通なら、コネクションを行うメソッドを作り、
そのメソッドの中で

 ・アドレス解決
 ・ソケットの生成
 ・コネクション

と言う一連の手順を実行させないか?
0231デフォルトの名無しさん05/01/18 15:40:43
自分の調べ方が悪いのかもしれませんが、
現在WinXPでBorland C++ Compiler 5.5を使って
C言語でソケット通信のプログラムを組んでおりますが
通信相手を限定する為にWindowsのコンピューター名を
指定する方法で制約がかかっております。
そこでNetBIOS名からIPアドレスをプログラム上で
使う方法がありませんでしょうか?
0232デフォルトの名無しさん05/01/18 16:42:41
これから言語覚えようと思うんですけど、direct Xって、visualc++以外でも使えますか?
0233デフォルトの名無しさん05/01/18 16:46:52
>>231
gethostbyname() で、
コンピュータ名から IP 得られなかったっけ?
0234デフォルトの名無しさん05/01/18 17:29:52
>>232
COMが使える言語ならどれでもいいと思うよ。
0235デフォルトの名無しさん05/01/19 14:08:16
age
023623105/01/19 14:09:34
>>233
gethostbyname()で試したところ取得できました。
ありがとうございました。
0237デフォルトの名無しさん05/01/19 15:56:04
あえて、文字列の途中にヌル文字を挿入したいのですが、
lstrcat(buf,"\x00");
0238デフォルトの名無しさん05/01/19 15:57:21
おっと、途中で送信されてしまいました。

上記のような文をforループで回して文字列を作成したいのですが
ヌル文字の部分だけ抜けてしまいます。 何か良い方法ってありますか?
0239デフォルトの名無しさん05/01/19 15:58:25
>237
buf[len+1]=0;
0240デフォルトの名無しさん05/01/19 16:04:23
memcpyでポインタをずらしてまわれ
0241デフォルトの名無しさん05/01/19 16:09:25
[ CTest.h ]

class CTest
{
void Draw() {};
void DrawTest2( CTest2 test2 ) {};
}


[ CTest2.h ]

class CTest2
{
void Draw() {};
void DrawTest( CTest test ) {};
}

main.cppの中でこれらを使用するにはどうしたらいいんでしょうか?
024223205/01/19 16:10:27
>>234
ご返答ありがとうございました。
024324105/01/19 16:10:44
>>241

正常にコンパイルする方法が知りたいんです。
0244デフォルトの名無しさん05/01/19 16:19:09
>241
class CTest;
class CTest2;
をヘッダーの最初に書け
0245デフォルトの名無しさん05/01/19 16:31:46
>>239 ってことはできあいの関数は使えないってことですね。
よくよく考えたら当たり前か・・・。 
自作関数でもつくるしかなさそうですね。
ありがとうございました。
0246デフォルトの名無しさん05/01/19 16:44:04
>>244

VCでやってるんですが、なぜかできないんですよ
エラーメッセージは
認識できない型 'CTest' が使われています。 >>> Init( CTest test ) {}の部分
CTest2' の宣言を確認してください。 >>> clas CTest2;
0247デフォルトの名無しさん05/01/19 16:44:54
>>246

エラーメッセージ訂正

エラーメッセージは
認識できない型 'CTest' が使われています。 >>> Init( CTest test ) {}の部分
'CTest' の宣言を確認してください。 >>> class CTest;
0248デフォルトの名無しさん05/01/19 16:59:27
>247
クラス定義の後で;忘れ
0249デフォルトの名無しさん05/01/19 17:06:27
>>248

いや ちゃんと書いてます。
0250デフォルトの名無しさん05/01/19 17:07:13
以前一つのファイルでできたと思ったので、分割せずに試してみたらそれも無理でした
なんでだろ〜なんでだろ〜〜><;
0251デフォルトの名無しさん05/01/19 17:12:07
http://gamdev.org/up/img/2242.zip

UPしたのでどうやったらコンパイルできるか誰か教えて
0252デフォルトの名無しさん05/01/19 17:12:10
ソースを晒すのが早いと思われ
■ このスレッドは過去ログ倉庫に格納されています