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

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

■ このスレッドは過去ログ倉庫に格納されています
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/
0693デフォルトの名無しさん2009/01/04(日) 16:10:46
>>689
http://wktk.vip2ch.com/vipper0531.jpg
0694デフォルトの名無しさん2009/01/04(日) 16:12:04
>>692
先ず、Cでは文字列をどう表わすか知ってる?
0695デフォルトの名無しさん2009/01/04(日) 16:12:55
>>692
void perror( const char *string );
文字列の先頭のアドレスを指定します

何の問題もありません
0696デフォルトの名無しさん2009/01/04(日) 16:14:58
>>692
char *aiueo = "あいうえお";
myprint(aiueo);

void myprint(char *str)
{
 printf("%s\n", str);
}

何かおかしい?
0697デフォルトの名無しさん2009/01/04(日) 16:19:26
>>696
ポインタ使う必要があるのでしょうか?
0698デフォルトの名無しさん2009/01/04(日) 16:21:02
>>697
それでは、逆にポインタを使わなければどうなるのでしょうか?
0699デフォルトの名無しさん2009/01/04(日) 16:21:48
>>698
ポインタ使う場合は、下記の文になる
使わないとできない

void mputs(char *p)
{
while(*p);
printf("&c", *p);
p++;
}
printf("\n");
}

mputs("エラーです”);
0700デフォルトの名無しさん2009/01/04(日) 16:31:26
string aiueo("あいうえお");
myprint(aiueo);

void myprint(string str)
{
 cout << str << endl;
}
0701デフォルトの名無しさん2009/01/04(日) 16:38:39
char *aiueo = "あいうえお";
myprint(aiueo);

void myprint(char *str)
{
 printf("%s\n", str);
}

変数aieuoに文字列 あいうえお を代入
char[0]にあ char[1]にい char[2]にう を入れる。
つまり、aiueoが指すアドレス領域はすべてchar型だと
で、aiueoを指定するとchar[0]のアドレスが得られる。
そのアドレスを引数にして関数に渡す。渡された関数でも同じことをし
str配列の中身を全て表示する

ということでしょうか
0702デフォルトの名無しさん2009/01/04(日) 16:40:35
だとしたら、こんな文でするよりそっちでしたほうがいいってことですよね
こんな文は使い道ないということかな

void mputs(char *p)
{
while(*p);
printf("&c", *p);
p++;
}
printf("\n");
}

mputs("エラーです”);
0703デフォルトの名無しさん2009/01/04(日) 16:43:37
>>701
システムがメモリーを確保して、そこに"あいうえお"と言う文字列定数を配置。
その先頭アドレスをchar型へのポインタ変数aiueoに代入。

aiueoが示すのは"あいうえお"の先頭だけ。
ただし、コンパイラはaiueoを使うときには、char単位に操作することを知っている。(char *と宣言したから)
0704デフォルトの名無しさん2009/01/04(日) 16:48:13
なんでaiueoには先頭アドレスしかはいってないのに
void myprint(char *str)
{
 printf("%s\n", str);
}
これで、全部表示されるかがわかりません。
引数としてmyprintに渡すのは先頭アドレス。
その先頭アドレスをchar *str でどう処理しているのでしょうか?
0705デフォルトの名無しさん2009/01/04(日) 16:51:28
>>704
Cの文字列について勉強するといいかも。

それから、↓の6.2を読んでみるとわかるかも。
http://www.kouno.jp/home/c_faq/c6.html
0706デフォルトの名無しさん2009/01/04(日) 16:59:27
こういうので、ネットでいちいち質問してたら効率悪すぎるよ。
適当な入門書でも読んでみたら?
0707デフォルトの名無しさん2009/01/04(日) 17:00:04
ダメだ全然わからない
なんでポインタの文字を一気に表示できるんだ

0708デフォルトの名無しさん2009/01/04(日) 17:00:21
>>706
独習Cよんでるがわからない
0709デフォルトの名無しさん2009/01/04(日) 17:01:10
文字列と配列 - 文字列 - C言語 入門
http://www.cppdrive.jp/cstart/string/index1.html
0710デフォルトの名無しさん2009/01/04(日) 17:01:20
そういうもんだって深く考えずに受け入れることも大事。
0711デフォルトの名無しさん2009/01/04(日) 17:02:14
>>707
ポインタの指してるとことから連続で並んでるからだろ。
0712デフォルトの名無しさん2009/01/04(日) 17:04:41
なんで、*strじゃなくてstr
0713デフォルトの名無しさん2009/01/04(日) 17:06:18
>>704の疑問がすべて>>702に書かれているというのに…
0714デフォルトの名無しさん2009/01/04(日) 17:12:21
過去を振り返っては駄目です
0715デフォルトの名無しさん2009/01/04(日) 17:13:26
>>658
俺はwhile君じゃないよ。回答側と言っている
お前はここ来るまえに日本語からやりなおせ
0716デフォルトの名無しさん2009/01/04(日) 17:14:36
宿題スレと統合したら?
結局、皆さんのおかげで課題が進みそうってw
0717デフォルトの名無しさん2009/01/04(日) 17:17:08
宿題スレは課題丸投げ用
0718デフォルトの名無しさん2009/01/04(日) 17:19:07
宿題テンプレも埋めるのが面倒臭いから、こっちに投げてんだろ。
テンプレ強制になっても、他に飛び火するだけ。
0719デフォルトの名無しさん2009/01/04(日) 17:23:15
文字列を作成すると自動的に末尾に\0が付加される
char *str = "あいうえお"
とすると
正確には あいうえお\0となっている
ので先頭の str[0] のアドレスさえ分かっていれば
\0がくるか0がくるまで その内容は何かしらの意味を持った文字列だと認識する

自分でもやってるだろ?
デバッカで
char *str = "あいうえお";
の内容を見てみれば分かる
0720デフォルトの名無しさん2009/01/04(日) 17:43:06
>>719
わかりました。
\0が出てくるまでが文字列ということですね。
0721デフォルトの名無しさん2009/01/04(日) 17:49:04
>>640
非常に解りやすい!!!
サンクスです
0722デフォルトの名無しさん2009/01/04(日) 18:20:00
ウィンドウに貼り付けたプッシュボタンのWM_NCHITTESTメッセージをキャッチするには
サブクラス化するしかないのでしょうか?
0723デフォルトの名無しさん2009/01/04(日) 18:49:02
そうだね。
0724デフォルトの名無しさん2009/01/04(日) 19:02:04
今リスト構造やってるんですが、ポインタが非常に分かりづらい;
どなたかおすすめのポインタ解説サイト知ってましたら
教えていただけないでしょうか
0725デフォルトの名無しさん2009/01/04(日) 19:33:56
小数点のより右の数字だけを取る方法はないでしょうか?
x * y =200.1となったら0.1にしてしまうような
0726デフォルトの名無しさん2009/01/04(日) 19:37:41
z = x * y;
z = z - (int)z;
0727デフォルトの名無しさん2009/01/04(日) 19:38:38
>>726
ハイパーサンクス!!
0728デフォルトの名無しさん2009/01/04(日) 19:38:45
trunc
0729デフォルトの名無しさん2009/01/04(日) 19:42:53
>726 の方法だとzがintの範囲をオーバーフローしてるときにおかしくなるね
0730デフォルトの名無しさん2009/01/04(日) 19:56:28
それと負の数も考えて、floorつかえばいいさ
0731デフォルトの名無しさん2009/01/04(日) 19:57:05
floorじゃだめか負の数
0732デフォルトの名無しさん2009/01/04(日) 19:58:39
modf使えよカス
0733デフォルトの名無しさん2009/01/04(日) 20:02:34
倍精度でも仮数部が52bitだから
64bit整数型使えば精度的に大丈夫のはず
0734デフォルトの名無しさん2009/01/04(日) 20:23:28
だから0方向切り捨てなんだからtrunc一発で終わりなんだって
0735デフォルトの名無しさん2009/01/04(日) 21:47:38
クラスは分かったけど配列クラスで詰んだ…
他にも同じような人いそうだな…
またこれが使えるようになった人ってのはやっぱり
テキスト熟読してやっとの事で理解出来たんだろうか
0736デフォルトの名無しさん2009/01/04(日) 21:50:54
>735
「配列クラス」というのは何のことだ
vector等のことか、それともオブジェクトの配列なのか
0737デフォルトの名無しさん2009/01/04(日) 22:26:27
grwinで三角形を任意の角度回転させて表示するってのを作ってるんですが
三角形の中心を求めて原点に置き、回転させる方法が分かりません・・
どなたかご教授おねがいしまう
0738デフォルトの名無しさん2009/01/04(日) 22:53:34
>>737
教授なんかできるか。
1. ググれない事情がある。
2. それらしい解説ページは見つけたが、言葉の意味が解らない。
3. 意味は解るが、コードに落とせない。
どれだ?
0739デフォルトの名無しさん2009/01/04(日) 23:06:20
>>738
そんな書き込み要らないから
0740デフォルトの名無しさん2009/01/04(日) 23:07:59
>>737
三角形の中心って外心?
重心なら簡単なんだけど。
0741デフォルトの名無しさん2009/01/04(日) 23:09:05
高校の数学の教科書でも見直せばいいんじゃね?
0742デフォルトの名無しさん2009/01/04(日) 23:26:06
普通に考えて慣性モーメントが最低の軸、つまり重心を通る軸じゃね?
0743デフォルトの名無しさん2009/01/04(日) 23:35:11
なるほど。
でも軸なの?
重心を中心にして点対称に回転させるんじゃないの?

ともかく「三角形の中心」を決めないと。
内心?外心?垂心?重心?傍心?
0744デフォルトの名無しさん2009/01/04(日) 23:41:57
中心が決まったら、あとは「アフィン変換」「回転行列」「クォータニオン」辺りで。
0745デフォルトの名無しさん2009/01/05(月) 00:38:14
>>737
>三角形の中心
中心は5つほどありますが、どれになさいますか
0746デフォルトの名無しさん2009/01/05(月) 00:44:06
傍心は中心じゃないだろw
0747デフォルトの名無しさん2009/01/05(月) 00:48:56
>>746

三角形の中心(さんかくけいのちゅうしん)とは、任意の三角形から一意的に求めることができる点の総称である。単に心または芯とも呼ばれる。

「五心」と呼ばれる点(内心・外心・重心・垂心・傍心)が一般的に広く知られている。
0748デフォルトの名無しさん2009/01/05(月) 00:59:00
下の例のような文字列や小数などが入り混じったchar型の変数の配列があります。
これから小数だけを取り出してファイル出力したいのですが、何かいい方法はあるでしょうか?

char name[0]=frame
char name[1]=0.123  ←取り出したい
char name[2]=23
char name[3]=1.234  ←取り出したい
0749デフォルトの名無しさん2009/01/05(月) 00:59:39
まるちうぜえ
0750デフォルトの名無しさん2009/01/05(月) 01:06:24
>文字列や小数などが入り混じったchar型の変数の配列
0751デフォルトの名無しさん2009/01/05(月) 01:19:51
取り出す前に、どうやって入れたのか知りたい
0752デフォルトの名無しさん2009/01/05(月) 01:27:54
そうだな
小数入れる前に構造体にしてフラグ立てとけよカス
0753デフォルトの名無しさん2009/01/05(月) 01:45:18
for(int i = 0; i < 4; i++){
 if(name[i].isFloat())
  name[i].toFile();
}
0754デフォルトの名無しさん2009/01/05(月) 02:49:45
規格書高ぇ・・・
0755デフォルトの名無しさん2009/01/05(月) 06:54:50
Unicode対応プログラムの作成練習してるけどしょっぱなからつまずいた…

#include<stdio.h>
#include<tchar.h>
#define _UNICODE
#define UNICODE

int main(void){

TCHAR uni[]=_T("UnicodeTest");

printf("%s\n",uni);
return 0;
}

上記のコードを実行するとUしか出力されません。原因はUの2バイト目が00なので
ヌル文字と勘違いしてしまうからだと予想しますがforで回すしか回避方法はないのでしょうか?
0756デフォルトの名無しさん2009/01/05(月) 07:10:05
つ wprintf
0757デフォルトの名無しさん2009/01/05(月) 07:20:54
TCHAR 使うんなら _tprintf だろ・・・。
それに、_UNICODE を定義するのなら tchar.h をインクルードする前っつーか、
プロジェクトファイルの設定をいじれ。
_MBCS が定義されてるかもしんないし、混乱の原因になる。
0758デフォルトの名無しさん2009/01/05(月) 07:24:04
(^ー゚)テヘッ
0759デフォルトの名無しさん2009/01/05(月) 08:29:01
か   わ   い   い
0760デフォルトの名無しさん2009/01/05(月) 11:46:49
>>754
X3010なら俺の上でアンアン言ってるぜ
0761デフォルトの名無しさん2009/01/05(月) 13:15:32
それ規格書じゃなくて魔導書じゃね?
0762デフォルトの名無しさん2009/01/05(月) 20:33:37
インデックスか
0763デフォルトの名無しさん2009/01/05(月) 20:34:35
vs2003を使っている者です。
ヘッダで構造体を
struct fff{
double a;
double b;
double c;
double d;
double e;
double f;
double g;
double h;
double i;
double j;
};

struct fff ggg[2]={
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
};

こういった形で宣言・初期化しているのですが、
double型のメンバの数を11個以上に増やすと、この構造体と全く関係のない処理でおかしな動きをしてしまうのです。
例えば、プログラム内で全く使われない、double型のメンバ数11以上の構造体を作ったとしても、どこかの演算に影響を及ぼしてしまうようです。
これは一つの構造体の大きさに上限があるということなのでしょうか?
また、これを解決し、多くのメンバを持つ構造体を宣言する方法などがあれば教えてください。
0764デフォルトの名無しさん2009/01/05(月) 20:45:14
>>762
イ、禁書目録?
0765デフォルトの名無しさん2009/01/05(月) 20:53:17
>>763
>ヘッダで構造体を宣言・初期化している
「そのヘッダをいろんなファイルで読み込んでいる」に500ガバス
0766デフォルトの名無しさん2009/01/05(月) 21:02:01
>>756
>>757
サンクス
0767デフォルトの名無しさん2009/01/05(月) 21:03:27
レイテンシ
0768デフォルトの名無しさん2009/01/05(月) 21:06:07
>>763
メンバ数の上限がそんなに低いところにあるとは考えられない。何か勘違いをしていると思われ。
問題の再現する最小限のソースを貼りたまえ。
0769デフォルトの名無しさん2009/01/05(月) 21:08:49
0x0040とは一体どういう意味なのでしょうか?

0xがつくから16進数かと思ってたけど違いますよね?

あとif文で、 変数 & 0x0040 == 0 とかいった文がありますが
これはどういう意味なのでしょうか?
この場合、変数には絶対0x0040のような値がはいるということでしょうか
また==0 で何を判定しているのでしょうか?

よろしくお願いいたします。
0770デフォルトの名無しさん2009/01/05(月) 21:11:11
テキストファイルを読み込み、行数を数えるプログラムを作れ(C言語)

との課題が出ました。
テキストファイルを読み込み配列(構造体で定義)に格納するところまでできたのですが

行数をカウントするプログラムがうまくいきません。

現在
char *strText(構造体で定義)

for (Count = 0; Count < TextVol(構造体で定義); i++) {
 if (strText[Count] == 0x0D) EnterCount++;
}

という感じです。
これだと
「abc□
 d□
 ef□
 g」
(□==改行)
という行は3行とカウントされてしまいます。(希望は4行)
ちなみにテキストファイルを読み込む関数と、カウントする関数は別で作れといわれています。

どうすれば最後
0771デフォルトの名無しさん2009/01/05(月) 21:11:54
> 0xがつくから16進数かと思ってたけど違いますよね?
まず、どうしてそう思うのか説明してくれ
07727702009/01/05(月) 21:12:06
とぎれてしまいました

どうすれば最後の行が空でない場合カウントさせることができるでしょう?
0773デフォルトの名無しさん2009/01/05(月) 21:13:30
>>772
+1すればいいじゃん。
07747702009/01/05(月) 21:22:28
>>773
その場合、
「abc□
 d□
 ef□
 g□
」
を5行とカウントしてしまいます。
空白行はカウントせずに最終行が空白行じゃない場合のみカウントさせたいのですが、いい方法はありませんか?
0775デフォルトの名無しさん2009/01/05(月) 21:26:09
>>769
0x0040は16進数で、10進数にすると64
>この場合、変数には絶対0x0040のような値がはいるということでしょうか
何も入りません
>また==0 で何を判定しているのでしょうか?
>よろしくお願いいたします。
面倒だからいやだ、以上
0776デフォルトの名無しさん2009/01/05(月) 21:27:57
>>775
文字コード あるいは アスキーコード
でググってみ
0777デフォルトの名無しさん2009/01/05(月) 21:29:18
>>765
>>768
先程いろいろ弄っていたら何故かこのバグが起きなくなってしまいました。
再現することすらできなくなってしまいました。
昨晩からずっと悩まされていた問題だったのに何故なんでしょう・・・
でもメンバ数を増やしただけで全く関係ないような演算におかしな結果が出たのは確かなんですよ

何はともあれ解決したので良かったです。助言ありがとうございました。
0778デフォルトの名無しさん2009/01/05(月) 21:31:24
>>773
行頭の1文字目が改行かどうかも判断したら良いんじゃね

ちょっと疑問なのは、最終行じゃなくて途中に空行があったらどうするつもり?
0779デフォルトの名無しさん2009/01/05(月) 21:31:40
>>774
最終行が空と言うか、改行で終わってるだけだから、
それを判定すれば・・・
0780デフォルトの名無しさん2009/01/05(月) 21:32:15
>>776
ただのビットフラグの判定がどう関係するんだ?
07817702009/01/05(月) 21:37:58
>>778
すみません TextVol はテキストファイルの大きさなので、
ただいまのカタチですと「行の先頭」との比較ができません。
途中の空白行がカウントされるのは問題ありません。

>>779
現在ですと
「abc□
 d□
 ef□
 g□
」
が4行

「abc□
 d□
 ef□
 g」

が3行とカウントされてしまうのでソコをなおしたいです。
0782デフォルトの名無しさん2009/01/05(月) 21:41:37
>>780
すまん、0x0040だけみて文字の判定かと思った。
0783デフォルトの名無しさん2009/01/05(月) 21:49:02
>>781
改行文字の次の文字が、次の行の先頭だよ
07847692009/01/05(月) 21:50:51
すみません、お願いします・・・
0785デフォルトの名無しさん2009/01/05(月) 21:53:17
>>781
ファイルの終端に改行文字が何文字連続してるか数えれば、
最後に空白行が何行あるかわかる
0786デフォルトの名無しさん2009/01/05(月) 21:54:22
>>781
そのforを抜けた後にcount番目の文字が改行文字でなければ1行増やす。
07877852009/01/05(月) 22:01:18
言葉足りなかった

改行文字の数+1で空白行も含めた行数が分かる。
そこから最後の空白行だけ引けばいい

んで最後に空白行が何行あるかは785
0788デフォルトの名無しさん2009/01/05(月) 22:01:24
お前ら、Cの演算子の優先順記憶してるの?
0789デフォルトの名無しさん2009/01/05(月) 22:04:34
>>784
まず2進数⇔10進数⇔16進数の変換ができるようになれ
そしたら「C言語 ビットシフト」でぐぐれ
0790デフォルトの名無しさん2009/01/05(月) 22:06:10
ビットシフトじゃなくてビットフラグ
0791デフォルトの名無しさん2009/01/05(月) 22:06:28
>>788
時々一覧を見るよ。
基本的には、括弧とかで確実にするよ。
0792デフォルトの名無しさん2009/01/05(月) 22:08:15
>>788
可読性を上げるためにも括弧をつかいます
■ このスレッドは過去ログ倉庫に格納されています