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

スレを勃てるまでもないC/C++の質問はここで 5

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001 ◆h6A7qfFFu6 2008/12/29(月) 11:05:07
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
0830デフォルトの名無しさん2009/01/06(火) 13:26:49
>>829
Cでスパイダーツール書くのに使えるヤツ
0831デフォルトの名無しさん2009/01/06(火) 13:28:54
スパイダーツールって何?
0832デフォルトの名無しさん2009/01/06(火) 13:33:25
>>831
こんな
http://www.amazon.co.jp/dp/4873111870
0833デフォルトの名無しさん2009/01/06(火) 13:52:48
なるほど
あんまり興味ないけど作って見ます
0834デフォルトの名無しさん2009/01/06(火) 22:25:03
デバッグ作業でよく発見する間違いってどんなのでしょうか?
0835デフォルトの名無しさん2009/01/06(火) 22:34:20
>>834
コーディング段階で発見できない間違いの殆ど全て。
0836デフォルトの名無しさん2009/01/06(火) 22:42:28
どういうのが発見できないのでしょうか?
0837デフォルトの名無しさん2009/01/06(火) 22:43:50
というか全部発見しようとするのがデバッグってもんじゃないかww
0838デフォルトの名無しさん2009/01/06(火) 22:45:50
仕様の誤解釈、typo、不注意、思い込み、&c...
0839デフォルトの名無しさん2009/01/06(火) 23:06:11
デバッガのバグとかも
0840デフォルトの名無しさん2009/01/06(火) 23:57:59
>>834
配列とかポインタでアクセスしたらいけないところにアクセスしてるのが多い
0841デフォルトの名無しさん2009/01/07(水) 01:35:17
C++(gcc4.1.2使っています)で、
下記のJAVAのように、
メソッド内で同一クラス内のメソッドを利用するにはどうしたらよいのでしょうか。

public class Greeting
{
public void sayHello()
{
this.hello();
}

private void hello()
{
System.out.println("Hello");
}

}
0842デフォルトの名無しさん2009/01/07(水) 01:37:40
this->hello();}
0843デフォルトの名無しさん2009/01/07(水) 01:43:30
>>842
できました。ありがとうございます。
0844デフォルトの名無しさん2009/01/07(水) 10:19:30
質問です( VC++ 2008EE )
クラステンプレート使用時、staticなconstメンバ変数の定義でエラーになってしまいます。

<ヘッダー>
template <typename T>
class samp{
private:
T number;
static const double db;
public:
...
void disp() const { std::cout << "db = " << db << std::endl; }
};

<cpp>
template <typename T>
const double samp<T>::db = 1.35;

このクラスのオブジェクトを生成して disp() をコールすると
db の外部参照が未解決と出てしまいます。
どう修正すべきでしょうか?
0845デフォルトの名無しさん2009/01/07(水) 10:29:20
定義が無いもの、定義書けばいいだろ
0846デフォルトの名無しさん2009/01/07(水) 10:43:00
VS2008で問題出ないけどなあ、それ。
08478442009/01/07(水) 11:00:00
>>845
<cpp>での定義の事でしょうか?
const double samp<int>::db = 1.35;
const double samp<char>::db = 1.35;
とかやれば通るんですがテンプレートの意味ないですよね・・・

>>846
マジですか?!
クラスの宣言と定義だけなら通るんですが、main にて
samp<int> smp;
smp.disp(); // ここでエラー
になってしまいます
0848デフォルトの名無しさん2009/01/07(水) 12:18:01
>>847
>とかやれば通るんですが
でも必要。
0849デフォルトの名無しさん2009/01/07(水) 12:22:43
const double samp<T>::db = 1.35;
で通るけどな、EEとProの違い?SP1だけど。
0850デフォルトの名無しさん2009/01/07(水) 12:29:42
スターチックなメンバ変数は外で定義する必要があるにょ
08518492009/01/07(水) 12:43:05
>>847
一応書いとくけど、通ったというのは
samp<float> hage;
hage.disp();

samp<int> *hoge = new samp<int>();
hoge->disp();
delete hoge;

で実行してのことだからな。
08528442009/01/07(水) 13:04:33
ああ・・・ 解決しました
template の場合、ヘッダで定義しないとまずい事を失念しておりました。
cppファイルでなく、ヘッダで
template <typename T>
const double Samp<T>::db = 1.35;
と定義する事で解決しました。 お騒がせいたしましたm(_ _)m
0853デフォルトの名無しさん2009/01/07(水) 13:49:31
そんなんじゃまた聞きにきそうだな
0854デフォルトの名無しさん2009/01/07(水) 14:05:13
じゃあ次の質問↓
0855デフォルトの名無しさん2009/01/07(水) 14:47:04
質問です。(C言語)

float *y,nb;

y = &nb;

printf("実数を入力\n");
scanf("%f",&y)

printf("%f",*y);

と書いたらセグメンテーション違反と言われてしまったのですが、恥ずかしながら何故そうなのか解りません。
ご教示お願いします。
0856デフォルトの名無しさん2009/01/07(水) 14:53:41
訂正。

float *y,nb;

y = &nb;

printf("実数を入力\n");
scanf("%f",&y);

printf("%f",*y);
0857デフォルトの名無しさん2009/01/07(水) 14:55:03
>>855
- scanf("%f",&y);
+ scanf("%f",y);
0858デフォルトの名無しさん2009/01/07(水) 14:57:58
>>855を訂正します。

×セグメンテーション違反と言われてしまったのですが〜

○入力した値が表示されないのですが〜

何度もすみません。。
0859デフォルトの名無しさん2009/01/07(水) 15:10:34
>>858
>>857
08608552009/01/07(水) 15:24:22
>>857
>>859

解決しました!
ご教示ありがとうございました。
0861デフォルトの名無しさん2009/01/07(水) 17:03:47
ナニを勃てるまでもない↓画像
0862デフォルトの名無しさん2009/01/07(水) 18:44:34
http://blog-imgs-40.fc2.com/n/e/t/netamichelin/2008103109.jpg
0863デフォルトの名無しさん2009/01/07(水) 18:58:52
ロベール先生、いつもお世話になっております。
0864デフォルトの名無しさん2009/01/07(水) 19:22:50
それはどうも。
0865デフォルトの名無しさん2009/01/07(水) 19:48:13
「はてな」ってwikipediaのパクリなんだな
0866デフォルトの名無しさん2009/01/07(水) 19:51:17
#include <iostream>
using namespace std;
void rensyuu();
int main()
{
rensyuu();
return 0;
}

void rensyuu()
{
int tensuu[] = {
12,78,100,43,56,87,29,60,43,52,
51,67,89,03,50,68,99,94,81,10,
22,55
};
int i;
for(i = 0; i < 22; i++ );
{
cout<<"出席番号"<<i<<"は"<<tensuu[i]<<"点です"<<endl;
}
}
エラーとかは出ませんが
出席番号22は-858993460点です

と、なってしまいます・・・

自分が思うようになってくれません
どこが間違っているんでしょう・・・???
0867デフォルトの名無しさん2009/01/07(水) 19:51:49
ひとつのプロジェクトファイルに
複数のソースファイルがあります。
main.c
├sub.c
inter.c
└ter2.c

みたいにあったとして、これをコンパイルするとひとつの実行ファイルになります。

どういう風にコードを組めば、ひとつの実行ファイルとしてコンパイルされるのでしょうか?

簡単なCのソースファイルしか書いたことなく何百行や何個もあるファイルからなるプログラムを作ったことないので
よくわからないので、よろしくおねがいします。
0868デフォルトの名無しさん2009/01/07(水) 19:54:39
>>867
なんで一つの実行ファイルになってるのか理解できないってことか?
0869だけじゃないけど敢えて伏せてみる2009/01/07(水) 19:54:56
>>866
自分で数えるからいけない。
int i;
for(i = 0; i < 22; i++ );
を
for (int i = 0; i < sizeof(tensuu) / sizeof(* tensuu); ++i)
に変えてご覧。
0870デフォルトの名無しさん2009/01/07(水) 19:56:24
>>869
ありがとうございます!!
0871デフォルトの名無しさん2009/01/07(水) 20:12:13
>>868
はい、そうです。
普通は1つのファイルをコンパイルしたらひとつの実行ファイルですよね。
普通はっていうか、Cを学び始めたころ思うには。
2つ3つのファイルになってコンパイルすると1つの実行ファイルになりますよね。(そう設定したらとは思いますが)
これらのファイルはお互いに参照?してるから自動的に一つの実行ファイルになるのかな?
main関数を含むファイルを中心にしてひとつの実行ファイルを仕上げるのでしょうか?

0872デフォルトの名無しさん2009/01/07(水) 20:33:26
>871
一応、main.cで他のファイルを全て
#include "xxxx.c"
すれば動くことには動くよ。

ただ最終的には分割コンパイルに慣れるべきだな。
各ファイルに対応するヘッダファイルを書くことになる。
覚えることが多いので詳しくは分割コンパイルで調べてくれ。
0873デフォルトの名無しさん2009/01/07(水) 20:34:35
>>871
>これらのファイルはお互いに参照?してるから自動的に一つの実行ファイルになるのかな?

VisualC++みたいな統合環境だと、プロジェクトの設定や登録されたソースなどから
コンパイラやリンカへの指示を自動でしてくれる。
自分でするなら、必要なソースをコンパイルし、それらと適切なライブラリをリンカに渡して実行ファイルに纏め上げる。
0874デフォルトの名無しさん2009/01/07(水) 20:51:52
>>872
大きなというか複数にわたるソースをみたことありますが、
見たやつはincludeはしてなかった気がします。
includeでもmainプログラムにそのファイルを取り込むってことだけど
その場合はファイルを結合っていう感じではなく、一部分をmainを取り込むみたいな感じですよね


0875デフォルトの名無しさん2009/01/07(水) 21:24:50
extern と static ではまる
特に static マジでヤバイ
static にふたつの意味がある
全然関係ないのに同じ static で書くから
初心者は混乱しまくる超やばい
0876デフォルトの名無しさん2009/01/07(水) 21:26:37
>>874
include 無くてもリンクすればひとつになる
プロトタイプ宣言がありさえすればいい
0877デフォルトの名無しさん2009/01/07(水) 21:28:16
で、プロトタイプ宣言を全部の *.c ファイルに書くのが面倒だから
共通のはまとめて *.h に書いて include するようになったんだと
0878デフォルトの名無しさん2009/01/07(水) 21:29:14
何をプロトタイプ宣言すればよいのでしょうか?
互いに関連性のないソースでもひとつになるということかな
だったら1つにしてしまったら、どっちかは機能しないのでは
0879デフォルトの名無しさん2009/01/07(水) 21:32:14
hoge.c
--------
int hoge(int hoge){
return hoge;
}
--------

fuga.c
--------
int hoge(int);
int main(){
printf("%d", hoge(123));
}
--------

これで include なしでリンクすると
fuga.exe ひとつだけにできる
0880デフォルトの名無しさん2009/01/07(水) 21:38:40
>>878
>何をプロトタイプ宣言すればよいのでしょうか?
共通に使いたいもの

>互いに関連性のないソースでもひとつになるということかな
互いに関連性のないソースをひとつにする意味があるのか?
(強いて言えばライブラリ作るとそうなることがあるけどその場合でも無関係のはあまり混ぜない)

>だったら1つにしてしまったら、どっちかは機能しないのでは
両方のソースで static になってるとそれぞれがそれぞれのソース内でのみ機能する
0881デフォルトの名無しさん2009/01/07(水) 21:40:27
>>875
だからC++は無名名前空間を取り入れたんだな。
0882デフォルトの名無しさん2009/01/07(水) 21:45:19
>>875
ポインタよりやばい罠

ポインタで躓くなんて言ってる香具師はたいしたことない
0883デフォルトの名無しさん2009/01/07(水) 22:48:25
>>875
スコープの方は別の単語にして欲しいよなぁ。(externの対義語はinternか?)
なんでこうなんだろ。
0884デフォルトの名無しさん2009/01/07(水) 22:58:43
ローカルな静的変数にするという意味で共通してるっしょ。
0885デフォルトの名無しさん2009/01/07(水) 23:16:33
>>883
勉強不足なだけだ
あれは別にスコープのためにあるんじゃない
0886デフォルトの名無しさん2009/01/07(水) 23:57:39
「extern つけたもの」 と 「extern つけないもの」
だけで充分な気がするのですが
ここに「static つけたもの」が入ってくると訳がわかりません
スコープのため意外になにがあるんでしょう
0887デフォルトの名無しさん2009/01/08(木) 00:01:32
hoge.c
--------
int hoge=10;
--------

fuga.c
--------
extern int hoge;
--------

hage.c
--------
int hoge;
--------

hige.c
--------
static int hoge=20;
--------

main.c
--------
extern int hoge;
int main(){
printf("%d", hoge);
}
--------
0888デフォルトの名無しさん2009/01/08(木) 00:02:18
hoge.c
--------
int hoge=10;
--------

fuga.c
--------
extern int hoge;
--------

hage.c
--------
int hoge;
--------

main.c
--------
static int hoge=20;
extern int hoge;
int main(){
printf("%d", hoge);
}
--------
0889デフォルトの名無しさん2009/01/08(木) 00:06:11
>>886
普通は外部に公開するので
むしろ extern なんてものの方がいらんだろ。
実際関数では extern なんてものは使わない。
変数は、宣言と定義を区別できないので extern が必要になるが。
0890デフォルトの名無しさん2009/01/08(木) 00:08:43
static グローバル変数と static ローカル変数って同じようなものだろ?
関数外に書かれたらファイルスコープで、
ブロック内に書かれたらブロックスコープになるだけで。
0891デフォルトの名無しさん2009/01/08(木) 00:56:46
だからスコープのためにあるんじゃない
実体を静的に解決するためにstaticがある
結果的に外部から実行時参照が出来なくなるだけ
0892デフォルトの名無しさん2009/01/08(木) 03:09:56
getlineを利用したプログラムなんだけど、コンパイラ時にエラーが出る

(.text+0x9a):undefined reference to `_getline'
collect2: ld returned 1 exit status

上のような警告が出て通らない。環境はCygwinでgcc3.4.4
libc 4.6.27以降にgetlineが入ってるみたいなんだけど、その情報をどう利用していいのかわからん
インストールのパッケージにありそうだと思って探したけどそれらしき物が見つからず途方にくれてる
includeし忘れとかそういう初歩的なミスはしてないつもり。
助けてください><
0893デフォルトの名無しさん2009/01/08(木) 03:22:30
>>892
それだけの情報ではぼくもわかりません><
せめてソースを晒してください><
0894デフォルトの名無しさん2009/01/08(木) 07:00:14
一つのCのソースファイルにて<stdio.h>などをインクルードしますよね

#include<stdio.h>
main{
printf....
}
みたいに
実際これをコンパイルするとなると、ライブラリ?も関係してくるのでしょうか?
stdio.hにかかれているものをライブラリからとりこんでくる?

開発環境のソフトつかってると、ソースファイルやヘッダファイルとは別にライブラリファイルも用意されてて
コンパイルするみたいなのですが、このときのライブラリファイルがよくわかりません。
普通にソースファイル単体をgccなりでコンパイルするとこのライブラリってファイルがないので疑問におもいました
0895デフォルトの名無しさん2009/01/08(木) 07:44:58
標準関数は、特に指定しなくてもリンクされるようになっていることが多い。
有名な例外は、unix系の場合のmathライブラリ。
0896デフォルトの名無しさん2009/01/08(木) 08:06:22
>>892
-lナントカでライブラリを指定してちょうだいということ。
0897デフォルトの名無しさん2009/01/08(木) 09:36:26
RAII てなんて読んでる?
上司がずっと「レイ」って言ってて何の事だかわからんかった
俺は「ライィー」て読んでるけど・・・
0898デフォルトの名無しさん2009/01/08(木) 11:20:45
しょーもない質問で申し訳ありません
Visual studio 2008を使っていますが
構成プロパティにC/C++の項目がでません
どうしたら出ますか?
0899デフォルトの名無しさん2009/01/08(木) 11:38:19
C/C++のプロジェクトを作る
0900デフォルトの名無しさん2009/01/08(木) 11:56:24
>>897
あーるえーつー
0901デフォルトの名無しさん2009/01/08(木) 12:41:52
えーと、言葉が足りなかったようなので補足説明させていただきます

ファイル→新規作成→プロジェクト→Visual C++→
Win32 コンソールアプリケーション→次へ→
コンソールアプリケーションと空のオブジェクトにチェックを入れる

この状態でコード書いて構成プロパティ見ても
構成プロパティにC/C++の項目が出ないんです
どなたか出す方法よろしくお願いします
0902デフォルトの名無しさん2009/01/08(木) 12:49:09
>>901
プロジェクトに新規追加でcppファイル入れたら出るよ
0903デフォルトの名無しさん2009/01/08(木) 13:10:46
>>902
出ました。
ありがとうございました。
09048922009/01/08(木) 13:28:17
$ gcc hoge.c -lc
/usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../libc.a(d000681.o):(.text+0x0): multi
ple definition of `_atexit'
/usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/lib/crt2.o:crt1.c
:(.text+0x2c0): first defined here
collect2: ld returned 1 exit status


getlineのエラーは出なくなったけど、今度はこんなエラーが出ちゃった
ソースを添付して聞く事は出来ればしたくないんだけど
ひょっとしてこういうエラーってソースが無いと原因をつきとめようがない?
コンパイラアセンブルは出来るけどリンクが出来ない状態だから、ライブラリの問題なのかなーと。
0905デフォルトの名無しさん2009/01/08(木) 14:28:31
ソース出せ
出せないときは出せない部分を削ってエラーだけが起こるソース出せ
削ってるうちにエラー消えるんなら出せない部分が原因
0906デフォルトの名無しさん2009/01/08(木) 14:30:36
g++ hoge.c
で治ったりする
0907デフォルトの名無しさん2009/01/08(木) 17:29:33
>>904
ふつうは -lc を指定する必要はないので、環境がなにか変なことになっている予感。
0908デフォルトの名無しさん2009/01/08(木) 20:27:36
char word[10][30];
という配列があり、現在配列には
word[0]:cabos
word[1]:banana
word[2]:apple
といった文字列が入ってるとします。
ここで、指定した番号の要素を消して配列を詰めるにはどうすればいいのでしょうか?
for文を駆使してみましたが、いまいち上手くいきません。(無くなった最後の要素には何を入れればいいのかわからない)

あと、この配列をアルファベット順に並び替える方法もしりたいです。
0909デフォルトの名無しさん2009/01/08(木) 20:33:39
>>無くなった最後の要素には何を入れればいいのかわからない

何もしなくていい。あるいは \0 を入れるとか自分で決めなさい。

>>あと、この配列をアルファベット順に並び替える方法もしりたいです。

ソートしなさい
0910デフォルトの名無しさん2009/01/08(木) 20:38:10
>>909
memmoveとか使うといいみたいですけど、
クラシックにやってみます
0911デフォルトの名無しさん2009/01/08(木) 20:58:01
n番目を削除するとして
for (i = n + 1; i < sizeof word / sizeof word[0]; ++i)
{
strcpy(word[i - 1], word[i]);
}
ソートはこれでいいだろとりあえず
qsort(word, sizeof word / sizeof word[0], sizeof word[0], (int(*)(const void *, const void *))strcmp);
0912デフォルトの名無しさん2009/01/08(木) 21:01:31
最後の要素(n=9)を削除すると、領域外をアクセスしちゃうよ(^o^ )
0913デフォルトの名無しさん2009/01/08(木) 21:34:26
static void print_ascending_list(char word[][WORD_SIZ_MAX + 1], int n)
{
int i,j;
char tmpword[1][WORD_SIZ_MAX + 1];
n--;
for(i=0; i<=n; i++){
strcpy(tmpword[0], word[i]);
for(j=i; j<=n; j++){
if(tmpword[0][0] > word[j][0]){
strcpy(tmpword[0], word[j]);
}
}
printf("%2d:%s\n", i+1, tmpword[0]);
}
}

ソートについて、こんなプログラムを作ったのですが、
これだと同じ単語を何度も出力しちゃうし、よくよく考えたら二文字以降の比較をしていないんですよね、、
どうにかできませんかね?
0914デフォルトの名無しさん2009/01/08(木) 21:37:31
strcmp
0915デフォルトの名無しさん2009/01/08(木) 22:06:45
0x1000 のアドレスが10000になるみたいなのですが、どうしてでしでしょうか?

0x10は10バイトという意味があるのでしょうか?

また、buf[10000]は、どのメモリアドレスまで格納できるという意味になりますか?
0916デフォルトの名無しさん2009/01/08(木) 22:08:29
意味不明
0917デフォルトの名無しさん2009/01/08(木) 22:13:16
0x1000や0x3EFFとかいったものは何を指すのでしょうか?
また、0x33や0x3F といったものも。
0x22FF | 0xFF01 など

これはメモリアドレスなのか、10進数になるのか、それとも両方になるのか

また、buf[10000]と確保したメモリアドレス?には、どれだけのメモリアドレス範囲が入るのでしょうか?
たとえば0x44000000〜0xFF0000000とか
0918デフォルトの名無しさん2009/01/08(木) 22:18:11
>0x って何?
16進数の接頭辞

> |
OR 演算子

>メモリアドレスなのか
ただの数値。
ポインタ型にキャストすればアドレスと解釈できはするが。

>buf[10000] と〜
buf の要素の型のサイズ×10000
0919デフォルトの名無しさん2009/01/08(木) 22:22:38
>>917
0x は16進数であることを明示するプレフィックス。
よって、0x1000 とか 0x3EFF はただの数字。

| は論理和をとる演算子。
0x22FF | 0xFF01 == 0xFFFF

buf[10000] と確保したものが、実際に確保されるアドレスは基本的に実行時に決まる。
範囲としては buf の型のサイズ * 10000
0920デフォルトの名無しさん2009/01/08(木) 22:28:01
>>919
ありがとうございます。よくわからないのですが
アドレスとして0x1000 を指定したら10000らしいのですが、これはなんのことでしょうか?
また、0xはメモリのアドレスにはならないのでしょうか?
0921デフォルトの名無しさん2009/01/08(木) 22:28:43
>>920
>アドレスとして0x1000 を指定したら10000らしいのですが、これはなんのことでしょうか?
どこでそんな話を聞いたんだ?
0922デフォルトの名無しさん2009/01/08(木) 22:31:49
配列の中身ってオチじゃ?
0923デフォルトの名無しさん2009/01/08(木) 22:32:44
16ビット環境のセグメントレジスタの話なら分かるが・・・。
0924デフォルトの名無しさん2009/01/08(木) 23:13:34
>>923
セグメントレジスタならどうやってありえる?
0925デフォルトの名無しさん2009/01/08(木) 23:13:57
でもメモリアドレスって0xからはじまってますよね
あれはなんででしょうか?
0926デフォルトの名無しさん2009/01/08(木) 23:15:29
>>924
10000が0x10000の間違いだというのなら、ね。
0927デフォルトの名無しさん2009/01/08(木) 23:18:06
>920
0x1000のアドレスにあるのがたまたま10000だっただけ。
理由なんて誰にも判らん。

0xのついた16進数だろうが普通の10進数だろうがアドレスになりうる。
だが直値でアドレスを指定する意味は
メモリの解析を行いたい時を除いてほとんど無い。
0928デフォルトの名無しさん2009/01/08(木) 23:51:53
>>927
直値?直値で指定する方法とは?
でもあらかじめ決められた領域にデータを書き込む場合は値をいれますよね?
その時に、0x....といれるような

メモリマップ?とかみると0x00000〜0x100000の領域は○○をとか
0x200000〜020001000 とかには○○のプログラムに使う領域の計算値をとか

こういう場合はメモリ範囲指定しますよね
このような場合は、どうやって指定するのでしょうか?
0929デフォルトの名無しさん2009/01/08(木) 23:53:34
>>928
>>918
レス数が900を超えています。1000を超えると表示できなくなるよ。