C言語なら俺に聞け(入門編)Part 60

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 59
http://pc12.2ch.net/test/read.cgi/tech/1263014439/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1258873470/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
http://pc12.2ch.net/test/read.cgi/tech/1260532772/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2デフォルトの名無しさん:2010/01/31(日) 16:06:22
signed char s = 'ア';

とすると、マイナスの値になりますが、マイナスの値になると何か支障がでるのでしょうか?

下記サイトに、

>ASCIIコードと1バイトのJISコードだけが使用可能です。
>それでもJISコードを使用するときは、unsigned char型である必要があります。
>それは半角カタカナ等が(161〜223)に定義されているためです。

http://c-production.com/contents/c/sec02.html#05

と書かれています。
最上位バイトが立つ文字を扱うときは、unsigned charにしなければならないのでしょうか?
3デフォルトの名無しさん:2010/01/31(日) 16:12:35
C/C++コード中のキャラクタセットの扱いなんてバッドノウハウの詰め合わせみたいなもんだから
正解は無いよ
4デフォルトの名無しさん:2010/01/31(日) 16:13:46
>>2
そもそも半角カナ使うこと自体が間違ってる..


とか言ったらこのスレッドでは叩かれちゃう?
5デフォルトの名無しさん:2010/01/31(日) 16:26:51
>>2
符号拡張されるから
6デフォルトの名無しさん:2010/01/31(日) 16:43:05
>4
ヨーロッパ言語のアクセント付き文字だってカタカナと変わらん。
ñ á é í ó ú ü ç
œ é è à î ô û ï
7デフォルトの名無しさん:2010/01/31(日) 17:36:08
#include <stdio.h>
void disp_2D_array(int nrow, int ncol, double *a_p);
int main(void)
{
int nrow = 3, ncol = 3;
double a[3][3] = {{1.56, 3.24, 5.24}, {3.24, 6.23, 8.16},
{7.32, 2.86, 4.12}};
disp_2D_array(nrow, ncol, &a[0]);
return 0;
}
void disp_2D_array(int nrow, int ncol, double *a_p)
{
int i, j;
for (i = 0; i < nrow; i++) {
for (j = 0; j < ncol; j++) {
printf(" %7.2f", *a_p); a_p++;
}
printf("\n");
}
}

というプラグラムのa_p++;はなにを意味しているのですか?
8デフォルトの名無しさん:2010/01/31(日) 17:48:40
ポインタを進めている
9デフォルトの名無しさん:2010/01/31(日) 17:54:30
>printf(" %7.2f", *a_p); a_p++;
この部分、
printf(" %7.2f", a_p[i * ncol + j]);
と同じ
10デフォルトの名無しさん:2010/01/31(日) 18:09:46
>>6
半角カナはchar1個分なのにマイナスってことじゃないの?
よくわからんけど
11デフォルトの名無しさん:2010/01/31(日) 19:39:57
#include <stdio.h>
int main() {
if ('ア' > 0)
printf("plus.\n");
else
printf("minus.\n");
return 0;
}
を実行すると、
minus.
になった。半角カナは負数扱いらしい。
12デフォルトの名無しさん:2010/01/31(日) 19:52:29
そうなったのは、そのソースファイルが SJIS になってるからでは?
13デフォルトの名無しさん:2010/01/31(日) 19:59:34
>>7です
a_p++;
がなくてもfor文があるからいいわけではないんですか?
14デフォルトの名無しさん:2010/01/31(日) 20:05:47
いいけど、a_p は ++ されないよ
15デフォルトの名無しさん:2010/01/31(日) 20:08:34
32Bitマシンと64Bitマシンって何が違うんですか?
コンパイラは違いを吸収してくれますか?
16デフォルトの名無しさん:2010/01/31(日) 20:28:48
32ビットマシンの場合はint, long, pointerが全部32ビットなので、それら
の区別をあいまいなまま使用しても動いてしまった。
64ビットマシンの処理系はint 32ビット、longとpointerが64ビットのデータモデル
を使っている場合が多い。書き換えが必要になる場合がある。
17デフォルトの名無しさん:2010/01/31(日) 20:29:32
>>11
試しにif内の0をunsigned intでキャストして実行してみろ
18デフォルトの名無しさん:2010/01/31(日) 20:51:51
>>16
ポインタサイズがちがうということは32BitでビルどしたDLLを64Bitで使うとかすると死ぬわけですね
dでした
19デフォルトの名無しさん:2010/01/31(日) 21:01:17
いつもgccでmakeしてるプログラムが有るんだけどVisual C++で同じようにコンパイルできる?
とりあえずVisualStudioインストールして少しいじってみたけど分からない
20デフォルトの名無しさん:2010/01/31(日) 21:04:10
makeの形式が違うだろ 
自動変換できる風呂グラムでもあれば出来るが
21デフォルトの名無しさん:2010/01/31(日) 21:22:13
>>18
64ビットプロセスから32bit dllはロード出来ないから安心しろ。
そこいら辺はOSがよきにはからってくれる。
22デフォルトの名無しさん:2010/02/01(月) 13:07:44
#include<stdio.h>
int main(){
int x=1;
int i;
while(x!=0){
printf("数値を入力してください\n止めたい場合は0を入力してください\n");
scanf("%d",&x);
if(x==2)printf("素数です\n");
else if(x==1)printf("素数ではありません\n");
else if(x%2==0)printf("素数ではありません\n");
else {
for (i=3;i<=x;i++){
if(x==i){printf("素数です\n");break;}
else if(x%i==0){printf("素数ではありません\n");break;}
}
}}
return 0;}
素数判定のプログラムですけど、先生からは無駄が多いと言われました
どこを直していけば無駄が少なくスマートなプログラムになります?
23デフォルトの名無しさん:2010/02/01(月) 13:15:07
基本は、nが与えられたら、2以上√n以下の数字割り切れるか調べること。

こんなもんだな
flg=1;
for( i=2; i*i < n; i++ ) if( n%i==0) { flg=0; break; }
if(flg) printf("sosu"); else printf("not sosu");
24デフォルトの名無しさん:2010/02/01(月) 13:17:42
>>22
・forループの中で調べるのは奇数だけで十分
・forループ継続条件はi*i<=xで十分
25デフォルトの名無しさん:2010/02/01(月) 13:24:36



http://codepad.org/G74gjU64

#include<stdio.h>
int primechk( int n){
int i;
for( i=2; i*i <= n; i++ ) if( n%i==0) return 0;
return 1; }

int main() {
int n;
for(n=1; n<20; n++)
if(primechk(n))printf("%dは素数です。\n",n);
else printf("%dは素数ではありません。\n",n);
}
26デフォルトの名無しさん:2010/02/01(月) 13:28:57
1は素数じゃねーよw
27デフォルトの名無しさん:2010/02/01(月) 13:29:50
1って素数だっけ
いやまぁどうでもいいけど
28デフォルトの名無しさん:2010/02/01(月) 13:47:39

http://codepad.org/5QB8HiAV

#include<stdio.h>
int primechk( int n){
int i;
if(n==1) return 0;
if(n==2) return 1;
if(n%2==0) return 0;
for( i=3; i*i <= n; i+=2 ) if( n%i==0) return 0;
return 1; }

int main() {
int n;
for(n=1; n<=20; n++)
if(primechk(n))printf("%dは素数です。\n",n);
else printf("%dは素数ではありません。\n",n);
}
2922:2010/02/01(月) 13:53:26
確かに素数を調べるのに、for文の中は奇数だけで十分ですね
変数X/2でも十分なのも指摘されて気がつきました

引数の使い方がまだ少しあやふやなので関数は作らないようにしてたんですけど
関数を作った方が大分さっぱりとしたプログラムになりそうですね
どうもありがとうございました
30デフォルトの名無しさん:2010/02/01(月) 14:55:06
ソースコードにMSVC BCC GCCとか判別するマクロ組み込むやつあるけど
これはどこで調べられるんですか。
コンパイラが勝手に定義するんだろうけど。
一覧表とかありますか。
31デフォルトの名無しさん:2010/02/01(月) 14:56:19
MSVCのときだけ、#include "stdafx.h"を有効にしたいんですが。
32デフォルトの名無しさん:2010/02/01(月) 14:59:38
#ifdef _MSC_VER
#include "stdafx.h"
#endif
33デフォルトの名無しさん:2010/02/01(月) 15:11:31
>>32
VC2008でエラーが出ます。BCCだと平気です。
stdafx.hなしでコンパイルできる方法ないですか。


fatal error C1020: 予期しない #endif です。
34デフォルトの名無しさん:2010/02/01(月) 15:13:24
_MSC_VER
__TURBOC__
__GNUC__
それぞれのコンパイラのマニュアルを参照するしかない

そもそも stdafx.h 自体要らないのでは?
プリコンパイルヘッダの設定を変えればいいと思う
35デフォルトの名無しさん:2010/02/01(月) 15:14:09
予測では、stdafx.hが何よりも速く読み込まれないとエラー出る仕組みになってると思います
36デフォルトの名無しさん:2010/02/01(月) 15:14:49
「プリコンパイルヘッダを使わない」という設定にすればいい
37デフォルトの名無しさん:2010/02/01(月) 15:17:42

プリコンパイル済みヘッダーを使用しない

にしたら出来ました。サンクス
38デフォルトの名無しさん:2010/02/01(月) 15:34:22
>>33
マジか
試さずに書いて申し訳なかったが、プリコンパイルヘッダへの
アプローチはBCCの方が正しいと思う

M$は何か変
39デフォルトの名無しさん:2010/02/01(月) 15:53:49
M$のプリコンパイルヘッダは#include "stdafx.h"を特殊処理するので今時他と共存させるのなら使わない方が無難。
と書こうとしたら既に書かれていた件。
40デフォルトの名無しさん:2010/02/01(月) 15:58:43
ビルドする前にクリーン(*.pchを削除)
をするのが最善
(プリコンパイルドヘッダも当然使う)
41デフォルトの名無しさん:2010/02/01(月) 18:12:04
VCは前回のコンパイル途中結果をディスクに保存し再利用して
処理時間を加速する。この時ヘッダファイルが更新されることは
仮定していない。通常のファイルは更新してもおkだが
ヘッダファイルを書き換えた場合は、途中結果をクリーン
してビルドしないとおかしなことになることが多い。
VC周りのトラブルのかなりの部分を占める。
42デフォルトの名無しさん:2010/02/01(月) 22:04:03
( ´▽`) ♪
43デフォルトの名無しさん:2010/02/01(月) 22:28:39
GetHitKeyStateAll関数は、キー入力を常に監視しえいるのでしょうか?
あるキーが押されている時はAの処理で、
押されていない時はBの処理、としたいのですが、

if( Buf[ KEY_INPUT_Z ] == 1 )
{処理A}
else
{処理B}

キーを押してAの処理は実行されるのですが、
キーを押すのを止めても、処理Bが実行されません。

独自に本などでC言語を勉強したので、
結構難しい問題も解けるようになったのですが、
実技?は全く駄目です。
よろしくお願いします。
44デフォルトの名無しさん:2010/02/01(月) 22:32:16
>>43
GetHitKeyStateAll 関数が呼ばれた時点でのキーボード情報をどっかに保存するだけでしょ
45デフォルトの名無しさん:2010/02/01(月) 22:38:47
なるほどです。
とすると、常にあるキーの状態を監視しようとすると、
while文を使えばいいのでしょうか?
46デフォルトの名無しさん:2010/02/01(月) 22:38:49
>>43
ループさせればいいじゃん
4743:2010/02/01(月) 22:40:25
皆さん、ありがとうございます。
やってみます。
48デフォルトの名無しさん:2010/02/01(月) 22:55:21
こんにちわ。それではさっそく質問です。
(変数定義割愛)
for(i=0;i<10;i++)
{
a=x[i]*i; //"x"は数列だとします
}

まぁ、ざっとこのような"a"を作ったとして、
「もしすべての"a"が同じ値をとるなら」
というif文を作りたい場合、
if(???){ ←はどのように書けばいいでしょうか?

質問が雑だし初歩的ですみませんが、よろしくお願いします。

49デフォルトの名無しさん:2010/02/01(月) 23:00:09

int all_chk(int *a){
int b=a[0];
for(i=1;i<10;i++)if(b!=a[i])return 0;
return 1;
}
50デフォルトの名無しさん:2010/02/01(月) 23:02:45
一見しただけじゃよくわかりませんが、
これを参考に勉強します。

大変ありがとうございました。
51推奨:2010/02/01(月) 23:03:52
効率は無視
後から読み返して理解出来ず書き直さないですませることを
前提とした書き方

int a[i],b;
for(i=0;i<1000000;i++){
a[i]=x[i]*i;
}
b=1;
for(i=1;i<100000;i++){
b=b &( (a[i-1]==a[i])?1: 0);
}
if(b!=0){
.....全部一致の場合
}else{
....一部不一致のものがある場合
}
52デフォルトの名無しさん:2010/02/01(月) 23:16:12
>>48
for(i=0; i<10; i++) if(x[i]) break;
if(i==10)
53デフォルトの名無しさん:2010/02/01(月) 23:43:59
>>48
i==0 のとき a==0
∴x[0]は任意 かつ i!=0 のとき x[i]==0
54デフォルトの名無しさん:2010/02/01(月) 23:45:09
>>52
for(a=0,i=0;i<10;++i)a+=x[i];return !a;

i=0;do{if(!i<10)return true;}while(!x[i++]);return false;
55デフォルトの名無しさん:2010/02/01(月) 23:47:46
>>52
for(i=1;i<10; i++)
56デフォルトの名無しさん:2010/02/02(火) 00:52:54
関数じたいをを配列みたいにすることって出来ますか

例えば
void A[0]()
{
.............
}

void A[1]()
{
.............
}

void A[2]()
{
.............

}

呼び出すとき
A[i]();

こんな感じで
57デフォルトの名無しさん:2010/02/02(火) 00:56:00
>>56
無理
呼び出す方かどこかで関数ポインタの配列を持って
それで分岐するなら可能
58デフォルトの名無しさん:2010/02/02(火) 01:19:04
>>57
ありがとうございます
解決できました
59デフォルトの名無しさん:2010/02/02(火) 01:20:16
for文の条件式に配列を指定したんですけどうまくいきません
int a[10]の0番目の要素を見てfor文を回したいんですよ
60デフォルトの名無しさん:2010/02/02(火) 01:21:14
な〜に〜
やっちまったな!
男は黙って↓
61デフォルトの名無しさん:2010/02/02(火) 01:25:45
pascal
62デフォルトの名無しさん:2010/02/02(火) 01:32:09
>>59
for(;ここに条件式を書きなさい;){}
63デフォルトの名無しさん:2010/02/02(火) 01:41:20
>>62
int a[10]={0 , 10 ,10, 10, 10, 10, 10, 10, 10, 10};
for(a[10] ; a[10] <10 ; a[10]++)
{

}

です。
64デフォルトの名無しさん:2010/02/02(火) 01:42:04
0番目の要素って言ってなかった?
65デフォルトの名無しさん:2010/02/02(火) 01:52:36
>>64
そうでした。。。
ありがとうございます
66デフォルトの名無しさん:2010/02/02(火) 05:35:42
引数も戻り値もvoidの関数って
コンパイル時にdefineのように扱われるのかな
67デフォルトの名無しさん:2010/02/02(火) 06:48:01
char str[10];
str = {"2","3","4"}

っていれたあとは、str[3]〜[9]は空ですよね?
これを削除してstr[3]に変えることってできますか?
68デフォルトの名無しさん:2010/02/02(火) 06:49:23
↑空の部分を削除してって意味です。
わかりづらくてすいません。
69デフォルトの名無しさん:2010/02/02(火) 06:54:22
> っていれたあとは、
はいりません。
> str[3]〜[9]は空ですよね?
空の定義は?

70デフォルトの名無しさん:2010/02/02(火) 09:25:10
配列の初期状態は未定義か\x00か
71デフォルトの名無しさん:2010/02/02(火) 10:43:32
たとえば3個の変数をそれぞれ独立に0〜9まで動かすときの全パターンである処理をするとき

for(int n1 = 0; n1 < 10; ++n1){
 for(int n2 = 0; n2 < 10; ++n2){
  for(int n3 = 0; n3 < 10; ++n3){
   /* ある処理 */
  }
 }
}

このように書くと,変数が10個100個と増えた場合階層が深くなりすぎて大変です。
変数の数が増えてもすぐ対応できるシンプルな記述方法はないでしょうか。
72デフォルトの名無しさん:2010/02/02(火) 10:49:37
再帰を使う。
73デフォルトの名無しさん:2010/02/02(火) 11:08:38
>>71
#include <stdio.h>
int *next(int *is, int size, int max) {
int i;
for (i = 0; i < size; ) {
(*(is + i))++;
if (max < *(is + i)) {
(*(is + i)) = 0;
i++;
} else {
return is;
}
}
return 0;
}
int main() {
int i, nums[3] = {0}, *p;
for (p = nums; p; p = next(nums, 3, 9)) {
printf("%d %d %d\n", nums[0], nums[1], nums[2]);
}
return 0;
}
実装はヘボイが、狙いは見ての通り。
0からmaxまででint配列の要素を増やしていく。
あとは、その配列を使う。
74デフォルトの名無しさん:2010/02/02(火) 11:09:23
>>72
頭が固くてぱっとは見えませんが調べる方向はわかりました。
どうもありがとうございます。
75デフォルトの名無しさん:2010/02/02(火) 11:13:45
>>73
おおありがとうございます><
76デフォルトの名無しさん:2010/02/02(火) 11:14:45
for(n1=n2=n3=0;n1<n1Max;++n3,n2+=(n3>n3Max?(n3=0,1):0),n1+=(n2>n2Max?(n2=0,1):0))
/*any処理*/;
77デフォルトの名無しさん:2010/02/02(火) 11:18:10
常に { } で括らなくちゃいけないわけではないので

for(int n1 = 0; n1 < 10; ++n1)
for(int n2 = 0; n2 < 10; ++n2)
for(int n3 = 0; n3 < 10; ++n3)
{
 /* ある処理 */
}

とすれば深くならないぞ
for文を10個も100個も並べる面倒さは変わらないが・・・
78デフォルトの名無しさん:2010/02/02(火) 11:21:00
再帰って限界あるよね?
俺の記述がバグってただけかもしれないが、
八回までは正常に再帰してくれるけど、
九回からはおかしくなる、九回目の呼び出しがされなかった覚えが。
八回目までで勝手に引き返してきた覚えが。
79デフォルトの名無しさん:2010/02/02(火) 11:23:16
>>78
よっぽどスタックが浅いのか、あるいは局所変数がデカいのか。
80デフォルトの名無しさん:2010/02/02(火) 11:54:57
>>78
それは本当に再帰の限界だったのか?
再帰に限ったことではなくループや順次でも n 回目からおかしいといバグは出るが
それだけでループが n 回までに制限されているという結論は出せないだろ
81デフォルトの名無しさん:2010/02/02(火) 12:23:59
>71
10個100個になるのは異常
深くならないように工夫する

>72
ふ〜ん、考えてみるか

>73
大域変数とプロシジャでも使うのか

>76
100個になったときを想像したら
82デフォルトの名無しさん:2010/02/02(火) 12:50:57
>>73
さらっと書いてあったので簡単かと思いきや
nextの動きを理解するのにめちゃ時間かかってしまったw
日常的に使われるテクニックなんでしょうか。

>>77
数個程度のオーダーなら一番読みやすいですね。
どうもありがとうございます。

再帰についてはこれから調べてみます。
83デフォルトの名無しさん:2010/02/02(火) 12:54:10
>>81
> 100個になったときを想像したら
プログラムで生成すればいい。コンパイラリミットとの戦いになるけど。w
84デフォルトの名無しさん:2010/02/02(火) 13:02:35
>>71
for(i=0; i<pow(10,n); i++) {
n0 = i % 10;
n1 = (i / 10) % 10;
n2 = (i / 100) % 10;
....
8573:2010/02/02(火) 13:25:38
>>82
日常的に使われるかどうかは分かりません。
必要に迫られてひねり出した苦肉の策です。
もとは、再帰でやっていたのですが、
再帰が深くなりすぎると失敗するみたいなので、
配列を使うことした、ということです。
86デフォルトの名無しさん:2010/02/02(火) 14:30:19
そもそもからして
int x[100];
for(x[0]=0;x[0]<3;x[0]++)
for(x[1]=0;x[1]<3;x[1]++)
for(x[2]=0;x[2]<3;x[2]++)
.....
for(x[99]=0;x[99]<3;x[99]++)
....

これが現在最速のPCですら、まともな時間で動作する
ような計算量ではない件
87デフォルトの名無しさん:2010/02/02(火) 14:36:36
3の100乗回か
88デフォルトの名無しさん:2010/02/02(火) 17:36:45
#include<stdio.h>
#define MAX 3

int num[MAX] = {0, 1, 2

となってるときに2をしてするなら

num[3]

だと思うのですがMAXを使って2を指定するには
どうすればいいですか
89デフォルトの名無しさん:2010/02/02(火) 17:39:22
num[3]は2じゃないぞ
90デフォルトの名無しさん:2010/02/02(火) 17:42:03
>>73
なるほどキモイね
イイ意味で
91デフォルトの名無しさん:2010/02/02(火) 17:42:03
MAXが3だから
num[MAX-1]にすれば、2を取り出すことは出来る
92デフォルトの名無しさん:2010/02/02(火) 17:43:13
> となってるときに2をしてするなら
> num[3]

うんにゃ 戻りが2を指す場所は num[2] だ。 (配列の添え字は 0 から始まるので)
int hoge[] = { 5, 4, 3 };
 hoge[0] → 5
 hoge[1] → 4
 hoge[2] → 3


> だと思うのですがMAXを使って2を指定するには
> どうすればいいですか

num[MAX-1] とでも書く

int foo[MAX] と MAX個の器を用意した場合には 0〜MAX-1 で参照するんだぜー
93デフォルトの名無しさん:2010/02/02(火) 17:48:51
char str[10];
str = {"234"}

っていれたあとは、str[3]〜[9]は何もはいってないですよね?
このはいってない部分を削除することできる?
容量を小さくしたいんですが、strに入れる文字列の長さが毎回違うので。
94デフォルトの名無しさん:2010/02/02(火) 17:50:05
静的確保してるから無理
95デフォルトの名無しさん:2010/02/02(火) 17:50:24
mallocについて調べると蝶最高な気分になれるぞ
96デフォルトの名無しさん:2010/02/02(火) 17:52:44
多少スレ違い気味で質問
str = {"234"}

この代入が可能なのは C99 から?
97デフォルトの名無しさん:2010/02/02(火) 17:53:33
amountという単語が有ってだな容量を表したりするんだ
maximumがゼロからカウントするかどうかに関わらず容量と
9888:2010/02/02(火) 17:55:41
num[MAX-1]
で動きました。ありがとうございます

99デフォルトの名無しさん:2010/02/02(火) 18:00:44
プログラムの設定ファイルの、読み込めなかった場合のデフォルトの値ってプログラムに埋め込んじゃうの?
100デフォルトの名無しさん:2010/02/02(火) 18:01:27
>>99
yes
101デフォルトの名無しさん:2010/02/02(火) 18:03:25
>>93
>何もはいってないですよね?
いや、何だかわからない値が入っている。
102デフォルトの名無しさん:2010/02/02(火) 18:06:59
>>101
str[3] は '\0' 固定じゃね?
103デフォルトの名無しさん:2010/02/02(火) 18:09:38
何が入るかは場所にもよるけどな。
しかし毎回変わるというのがグローバルっぽくないのだが、
容量を小さくしたい、というからにはグローバルなんだろうか。
104デフォルトの名無しさん:2010/02/02(火) 18:11:19
>101
記憶クラスによる
105デフォルトの名無しさん:2010/02/02(火) 18:12:53
malloc使って動的に確保すれば
char str[3][10];

str[0][10]〜str[2][10]に入れる文字列の長さが違ってもサイズ無駄なく格納できますか?
106デフォルトの名無しさん:2010/02/02(火) 18:14:09
>>105
すきまができますね。
107デフォルトの名無しさん:2010/02/02(火) 18:16:25
>malloc使って動的に確保すれば

から

>char str[3][10];

の類推の段階で、無駄なくつめることができていない

char* str[3]

ならそう記述する可能性は高まるけど…
ポインタと配列に関することは大丈夫か? と不安になる返答だね
108デフォルトの名無しさん:2010/02/02(火) 18:18:02
>>96
オレも気になる
109デフォルトの名無しさん:2010/02/02(火) 18:52:07
試してみた
1^Inbsp;^Inbsp;int
2^Inbsp;^Inbsp;foo(void)
3^Inbsp;^Inbsp;{
4^Inbsp;^Inbsp;^Inbsp;^Inbsp;char *foo;
5^Inbsp;^Inbsp;^Inbsp;^Inbsp;char bar[10];
6^Inbsp;^Inbsp;
7^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo = (char []){"abc"};
8^Inbsp;^Inbsp;^Inbsp;^Inbsp;// 下と同じ
9^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = (char []){'a', 'b', 'c', '\000'};
10^Inbsp;^Inbsp;
11^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = {"abc"};
12^Inbsp;^Inbsp;^Inbsp;^Inbsp;// error : 左ブレースが異常
13^Inbsp;^Inbsp;
14^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo[0] = 'q';
15^Inbsp;^Inbsp;^Inbsp;^Inbsp;// ok : 書き換え可能
16^Inbsp;^Inbsp;
17^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo = (char *){"abc"};
18^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = "abc"; と似たようなもの
19^Inbsp;^Inbsp;
20^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = (char *){'a', 'b', 'c', '\000'};
21^Inbsp;^Inbsp;^Inbsp;^Inbsp;// warning : 初期化子が多い
22^Inbsp;^Inbsp;
23^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo[0] = 'q';
24^Inbsp;^Inbsp;^Inbsp;^Inbsp;// maybe : foo : char const *
25^Inbsp;^Inbsp;
26^Inbsp;^Inbsp;^Inbsp;^Inbsp;// bar = (char []){"abc"};
27^Inbsp;^Inbsp;^Inbsp;^Inbsp;// error : bar : char * const
28^Inbsp;^Inbsp;^Inbsp;^Inbsp;(void)bar;
29^Inbsp;^Inbsp;
30^Inbsp;^Inbsp;^Inbsp;^Inbsp;return 0;
31^Inbsp;^Inbsp;}
110デフォルトの名無しさん:2010/02/02(火) 18:53:44
>109 おっと、正規表現で&をエスケープしてなかった>110
1  int
2  foo(void)
3  {
4    char *foo;
5    char bar[10];
6  
7    foo = (char []){"abc"};
8    // 下と同じ
9    // foo = (char []){'a', 'b', 'c', '\000'};
10  
11    // foo = {"abc"};
12    // error : 左ブレースが異常
13  
14    foo[0] = 'q';
15    // ok : 書き換え可能
16  
17    foo = (char *){"abc"};
18    // foo = "abc"; と似たようなもの
19  
20    // foo = (char *){'a', 'b', 'c', '\000'};
21    // warning : 初期化子が多い
22  
23    // foo[0] = 'q';
24    // maybe : foo : char const *
25  
26    // bar = (char []){"abc"};
27    // error : bar : char * const
28    (void)bar;
29  
30    return 0;
31  }
111デフォルトの名無しさん:2010/02/02(火) 18:56:58
インデントは専ブラにやらせるのが楽
112デフォルトの名無しさん:2010/02/02(火) 23:17:10
 codepad
 ttp://codepad.org/

長いソースを貼るときはここへ!


ってテンプレートに入れようぜ。
113デフォルトの名無しさん:2010/02/02(火) 23:38:54
お前が立てるときに足せばいいじゃないか
114デフォルトの名無しさん:2010/02/02(火) 23:50:30
>>109
検証下手だなぁ
115デフォルトの名無しさん:2010/02/03(水) 00:34:09
配列 int out[3]={1,5,3};
の配列の各要素の大小関係を比べるプログラムをfor文で作りたんですけど
どうすればいいですか?
116デフォルトの名無しさん:2010/02/03(水) 00:36:39
宿題は宿題スレへ
117デフォルトの名無しさん:2010/02/03(水) 00:37:09
>>115
バブルソートでググればおk
118デフォルトの名無しさん:2010/02/03(水) 00:41:28
>>116
わかりました。
宿題スレに行きます
119デフォルトの名無しさん:2010/02/03(水) 11:56:08
最近気づいたんだが、固定幅フォントより非固定幅のほうが目に優しいわ
120デフォルトの名無しさん:2010/02/03(水) 12:31:20
>>119
これ?

プログラミングはプロポーショナルフォントの方が読みやすい ?
http://slashdot.jp/developers/article.pl?sid=10/01/20/025204
121デフォルトの名無しさん:2010/02/03(水) 14:21:11
#defineで定義されたマクロの有効範囲は#undefされない限り翻訳単位内のみとのことですが
#define HOO foo という定義を含むファイルをincludeした場合
includeした側にもこのマクロが適用されると言うことでしょうか
122デフォルトの名無しさん:2010/02/03(水) 14:23:36
>>121
yes

そうでないと インクルードガードが効かなくなっちゃう
123デフォルトの名無しさん:2010/02/03(水) 14:24:03
そうだよ
意識しなくても標準ライブラリで#defineされたものを普通に使ってると思うけど
124デフォルトの名無しさん:2010/02/03(水) 14:27:41
逆にファイル外に伝播して欲しくない場合はundefで明示しないといけないと言うことですね

ありがとうございました
125デフォルトの名無しさん:2010/02/03(水) 17:16:34
二つの文字列を連結させるプログラムを書いたんですが
以下のままでは文字列終端のNULL処理がされていないと言われました
mojiC[100]の中身を初期化した時点でNULL処理できている気がするんですが

#include<stdio.h>
int main(void) {
/* 連結した文字列を格納するのに十分な長さの配列 */
char mojiC[100] ;
/* 連結元の文字列 */
char mojiB[] = "World" ;
char mojiA[] = "Hello" ;

/* 連結を行うプログラム */
int i, j;
       for(i=0;i<100;i++){ //mojiC[100]の中身を初期化
mojiC[i]=0;
}
for(i=0;mojiA[i]!=0;i++){ //mojiC[100]にmojiA[]の中身をコピー
mojiC[i]=mojiA[i];
}
for(i=0,j=0;mojiC[i]!=0;i++,j++){
}
for(i=0;mojiB[i]!=0;i++,j++){ //mojiC[100]にmojiB[]の中身をコピー
mojiC[j]=mojiB[i];
}

printf("%s\n", mojiC) ; /* HelloWorld と表示 */

return(0) ;
}

126デフォルトの名無しさん:2010/02/03(水) 17:19:35
100+300では駄目だろ 100個しかしてないからな
127デフォルトの名無しさん:2010/02/03(水) 17:22:27
memcpyつかった方が転送効率良いよ。
どんな長さでも動くようにするには、動的確保。
あと初期化する必要なし、手間がかかる。
動的確保 -> memcpyでデータ配置  -> 最後にNULL付加でよし
128デフォルトの名無しさん:2010/02/03(水) 17:24:54
>>125
>文字列終端のNULL処理
NULL じゃねえ、'\0' 或いは NUL。
てのは置いといて、
>できている気がするんですが
できてる。

無駄は多いけどな。
(2つ目のループは j = i; とすれば要らないだろ、とか)
129デフォルトの名無しさん:2010/02/03(水) 17:26:39
NULLってのとナル文字(ヌル文字?)の区別を学ぼう。
char c = '\0'がそれ。

あと、char mojiC[100] = {'\0'};こういうことをしておけば、
「mojiC[100]の中身を初期化」の部分は不要。

ただ、普通は配列を初期化なんぞしないで、
文字列をコピーした最後に'\0'をくっつけるのフツー。
130デフォルトの名無しさん:2010/02/03(水) 17:27:34

こんなふうだ。

mojiwa(char *p, char *a ,char *b,){
int m=strlen(a);
int n=strlen(b);
char *p = (char *)malloc(m+n);
memcpy(&p[0],a,m);
memcpy(&p[m],b,n);
p[m+n]=NULL;;
}
131デフォルトの名無しさん:2010/02/03(水) 17:27:49
かぶった。>>129>>125宛て。
132デフォルトの名無しさん:2010/02/03(水) 17:32:38
>>127
>memcpyつかった方が転送効率良いよ。
それ言うなら strcat 使え、って話に…
まあ習作なんだろうから、自分でコピーしてみるのはアリかも知れん。
133デフォルトの名無しさん:2010/02/03(水) 17:34:06
>>132
ですよねー
134デフォルトの名無しさん:2010/02/03(水) 17:36:45
>130
やべぇ、何やってんのかさっぱりわからん
135デフォルトの名無しさん:2010/02/03(水) 17:37:00
勉強のためなんだろうから、あえて使ってないんだろう。
最初にj=0にしておけば、mojiCへの代入はすべて
mojiC[j++]= とやれば途中のj++の部分は全部消せる。
最後にmojiC[j++]='\0';とかいれとけ
136デフォルトの名無しさん:2010/02/03(水) 17:43:51
strlen memcpyという関数を自作すれば見通し良い。
137デフォルトの名無しさん:2010/02/03(水) 18:14:08
同一名称、あるいは酷似した名称を使うのは
車輪の再発明で悦に入る行為かもな
内容は同じなライブリ関数を自作して使用するの
は悪いこととは限らないといった程度
138やってみた:2010/02/03(水) 18:16:48
void *
memcopy(void *d1, const void *s1, size_t sz)
{
 char *d2 = d1;
 const char *s2 = s1;

 while (sz-- > 0)
  *d2++ = *s2++;
 return d1;
}
139デフォルトの名無しさん:2010/02/03(水) 19:02:08
int m=strlen(a); // 超違和感
140デフォルトの名無しさん:2010/02/03(水) 19:03:45
何故sprintf()を使わないのか?無意味な苦労はバグを生むだけ。
141デフォルトの名無しさん:2010/02/03(水) 19:18:46
無意味な苦労でも、車輪の再発明でも、実装を知っていることは良いことだ。
日本のイット業界なんかアルゴリズム詳しく知らなくても仕事できちゃうもん。
あはは。
142推奨:2010/02/03(水) 19:51:46
実装など実務経験の間に自然に知って欲しかった
というのはあるかも知れないが
いつの時代でもコンスタントにそれが
出来るとは限らない
とりわけ露出狂時代にはね。
143デフォルトの名無しさん:2010/02/03(水) 22:53:58
>>141
だって、技術者じゃなくドカタだもん
144デフォルトの名無しさん:2010/02/03(水) 23:07:14
アルゴリズムってなに?
145デフォルトの名無しさん:2010/02/03(水) 23:08:48
>>144
Wikipedia読んで、それでもわからなかったら、丸一日考えて、
それでもわからなかったら、何がわからないのか質問しなさい。
146デフォルトの名無しさん:2010/02/04(木) 09:22:26
>>144
いーっぽすすんでまえならえ〜♪
147デフォルトの名無しさん:2010/02/04(木) 10:37:05
コンパイル環境のエンディアンを調べるれるようなマクロとかってある?
それか明示的にエンディアン指定できるpragmaとかあればいいんだけど
148デフォルトの名無しさん:2010/02/04(木) 11:23:22
149デフォルトの名無しさん:2010/02/04(木) 15:43:38
#include <stdio.h>
/* 整数の2進表現を下位から表示 */
int main(void)
{
int n, b;
n = 0;
do {
b = n % 2;
printf("%d\n", b);
n /= 2;
} while (n > 0);
return 0;
}

このプログラムをn=0にしたときに同じ結果を得るにはどうしたらいいのですか?
150デフォルトの名無しさん:2010/02/04(木) 15:46:26
if(n==0)で0の時だけ処理分ける
151デフォルトの名無しさん:2010/02/04(木) 15:48:50
>>149
何と同じにするのか分からん
152デフォルトの名無しさん:2010/02/04(木) 15:58:59
>>149
2進数はビット演算子を使うのが常套手段じゃないのかな?

int n;
n = 15;
do {
printf("%d\n", n & 1);
} while ((n >>= 1) > 0);
153デフォルトの名無しさん:2010/02/04(木) 16:03:20
>>152 n進数への応用がきかない。
154デフォルトの名無しさん:2010/02/04(木) 16:14:42
#include <stdio.h>
int main() {
int n = 7, i;
for (i = 0; i < sizeof n * 8; i++) {
printf("%d\n", !!(n & (1 << i)));
}
return 0;
}
155デフォルトの名無しさん:2010/02/04(木) 16:35:11
そもそも>>151の言うように、どういう出力を期待してるのか
質問者は書いてみてくれないか
156デフォルトの名無しさん:2010/02/04(木) 22:06:21
while(1)の中で
入力待ちをはさんでenter一回押して
次いくようにするにはどうすればいいですかね?
157デフォルトの名無しさん:2010/02/04(木) 22:09:20
環境にもよる
158デフォルトの名無しさん:2010/02/04(木) 22:14:17
>>156と似たようなことやりたくて、前にこんな書き方してたけど、問題ないですかね

void wait(void){
wchar_t enter[1];
fgetws(enter, 1, stdin);
while(getwchar() != L'\n');
}
159デフォルトの名無しさん:2010/02/04(木) 22:20:24
>>158
'\n' より先に EOF がくると無限ループしない?
160156:2010/02/04(木) 22:42:16
なんかこれででけたわ。大丈夫かな?
char wait;

scanf("%c",&wait);
161デフォルトの名無しさん:2010/02/04(木) 23:17:58
変数を途中で初期化することは出来ますか?

int a=0;

〜 プログラム 〜

/* ここで、一旦0にリセットしたい。 */

〜 プログラム 〜
162デフォルトの名無しさん:2010/02/04(木) 23:23:40
>>161
代入ならできる
163デフォルトの名無しさん:2010/02/04(木) 23:27:57
そうですね。
単純なことを忘れてました。
164デフォルトの名無しさん:2010/02/04(木) 23:31:05
>>161
代入って代わりに入れるんですよね
どこに代わりに入れるんですか
165デフォルトの名無しさん:2010/02/04(木) 23:56:15
>>164
161の例でならaでしょ
166158:2010/02/05(金) 00:35:30
>>159
有り難う御座います
Ctrl+ZでEOFを入力したところ無限ループにはならなかったのですが
入力した文字にEOFが含まれていると、fgetwsがもう一度入力を求めるような挙動になりました
これはどういうことなんでしょうか
167デフォルトの名無しさん:2010/02/05(金) 14:36:24
ファイルじゃなくて
メモリを
freadやfgetsとかする方法って無いですか?
168デフォルトの名無しさん:2010/02/05(金) 14:43:05
/dev/kmemでもオープンしてみる?
169デフォルトの名無しさん:2010/02/05(金) 14:44:05
イミフな質問だな
こいつは何がやりたいんだろう
170デフォルトの名無しさん:2010/02/05(金) 14:50:55
いちゃいちゃうふふ♪ をみたいのだろう。
171デフォルトの名無しさん:2010/02/05(金) 14:58:18
c言語、郵便料金の求め方

定形郵便
長さが14〜23.5cm、幅が9〜12cm、厚さが1cmまでのもの
重さが50gまでのもの
封書の長さ、幅、厚さ、及び重さを与えて、次の表から郵便料金を計算する。

定形外郵便
上記の条件をオーバーしているもの。



郵便料金

25gまで 定形80円 定形外130円
50gまで 定形90円 定形外130円
100gまで 定形外 190円
250gまで 定形外 270円
500gまで 定形外 390円
1kgまで 定形外 700円
2kgまで 定形外 950円
3kgまで 定形外 1150円
4kgまで 定形外 1350円

なお、次の条件を満たしていない場合は、第1種の郵便物の取り扱いとならないので、その旨の表示を行う。

長さが14cm以上60cm以下である。
幅が9cm以上である
長さ+幅+厚さが90cm以上である。
重さが4kg以下である。

つまりこの条件にひとつでも当てはまれば、(この郵便物は取り扱いできません。)と表示させれば大丈夫です。
172デフォルトの名無しさん:2010/02/05(金) 14:59:41
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
http://pc12.2ch.net/test/read.cgi/tech/1260532772/
173デフォルトの名無しさん:2010/02/05(金) 15:00:23
で、何?

宿題なら専門スレにどうぞ
174デフォルトの名無しさん:2010/02/05(金) 15:01:25
最新は134代目だったな。
175デフォルトの名無しさん:2010/02/05(金) 15:02:07
>>169
今までパッケージしていなかったファイルを
パッケージ化して一部取り出してメモリに格納して処理したい
一時ファイルを作らずにやりたい

で、ファイルでやっていた処理を
メモリ版として使いたい
なるべくソース書き換えたくない
freadならなんとかなるけど
fgets,fscanfとか書き換えるのめんどい

fopenをなんとかしたらなりそうな気がするけど無理か
176175:2010/02/05(金) 15:02:57
宿題じゃないけど
宿題スレで聞いた方がいい?
177デフォルトの名無しさん:2010/02/05(金) 15:04:23
宿題じゃなきゃなんだよ。
趣味か?
まさか業務じゃあるまい。
178デフォルトの名無しさん:2010/02/05(金) 15:06:48
ん? 175=176≠171か。
179デフォルトの名無しさん:2010/02/05(金) 15:11:56
>>175
FILE *tmpfile(void);
で一時ファイルを作るのがいいと思う

実際にファイルが作られるかどうかは実装依存だけど
小さなものならメモリ上でうまくやってくれそうな気はする
180デフォルトの名無しさん:2010/02/05(金) 15:15:04
stringstreamみたいなのがアレばいいのにね
181デフォルトの名無しさん:2010/02/05(金) 15:16:28
tmpfileだとバイナリで
fscanf等、文字列系の処理がうまくいかない気がする
182デフォルトの名無しさん:2010/02/05(金) 15:24:35
memccpyとかscanfにするのではダメなのか
183デフォルトの名無しさん:2010/02/05(金) 15:25:28
似たような質問が

C言語の質問です。 mallocなどで確保した任意のメモリ領域をFILE構造体、またはファイルディスクリプタとして扱う方法はないでしょうか? OSに依存した方法でもかまわな.. - 人力検索はてな

http://q.hatena.ne.jp/1212571670
184デフォルトの名無しさん:2010/02/05(金) 15:28:51
つ fmemopen
185デフォルトの名無しさん:2010/02/05(金) 15:30:26
fopen( filename , "rt" )なのを
fopen_b( data , size , "rt" )
ってな感じに書き換えるだけで無いかなと
directXで言うD3DXCreateTextureFromFile、D3DXCreateTextureFromFileInMemoryみたいな

コード書き換えるか一時ファイル作ります

ありがとうございました
186デフォルトの名無しさん:2010/02/05(金) 15:32:06
>>184
うわああ
それです。
ありがとうございます
ありがとうございます
187デフォルトの名無しさん:2010/02/05(金) 16:50:40
>>186
うわああ
なんどもありがとうございますといってくれて
ありがとうございます
ありがとうございます
188デフォルトの名無しさん:2010/02/05(金) 19:08:31
fmemopen()てgcc限定?
189デフォルトの名無しさん:2010/02/05(金) 20:24:08
gccのbuiltinでは無い。
190デフォルトの名無しさん:2010/02/05(金) 20:54:25
今はまだglibc限定
191デフォルトの名無しさん:2010/02/05(金) 21:05:41
for(i=0;i<1;i=i+0.1)
 {

 }


と書くと、無限に動き続けるのはなぜですか?
0.1を1に直すと正常に動くので、小数のせいかなとも思ったのですが、
{}の中で、0.1刻みの計算をしたいのです。
192デフォルトの名無しさん:2010/02/05(金) 21:09:38
iはdouble or floatで宣言されてる?
193デフォルトの名無しさん:2010/02/05(金) 21:13:11
いつも「i++」と置いているので「int」になっていましたw
ちゃんと動くようになりました。
194デフォルトの名無しさん:2010/02/05(金) 21:26:06
コンパイラの警告レベルは高くしる
195デフォルトの名無しさん:2010/02/05(金) 22:00:04
printf("誤差率 %lf %",a);

誤差率 a %

のように表示させたいのですが、半角の%だと表示されません。
全角を使うしかないのでしょうか?
196デフォルトの名無しさん:2010/02/05(金) 22:04:45
>>195
%%
197デフォルトの名無しさん:2010/02/05(金) 22:05:47
printf("誤差率 %lf %c",a,'%');
198デフォルトの名無しさん:2010/02/05(金) 22:08:37
有難うございました。
199デフォルトの名無しさん:2010/02/06(土) 00:43:25
何か本当に入門スレだな
200デフォルトの名無しさん:2010/02/06(土) 01:27:47
それがなにか?
201デフォルトの名無しさん:2010/02/06(土) 06:55:30
ファイルがない場合は新規に作成する、名簿のプログラムを作りました↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10495.txt

コマンドプロンプトでは上手く表示されるのに、datファイルを開こうとすると
「Null文字を含むファイルです。Null文字は半角スペースへ変換しました。」
となり、文字化けしてしまいます。

文字化けを防ぐにはどうすればいいですか?

202デフォルトの名無しさん:2010/02/06(土) 07:04:04
>datファイルを開こうとすると
じゃなくて、
“このプログラムを使用して作成したdatファイルをテキストエディタ(TeraPad)で開こうとすると”
だろ。

このプログラムが作成しているのはテキストファイルじゃなくてバイナリファイルだから当然だ。
203うんこ:2010/02/06(土) 15:57:07
OS:Windows Vista
コンパイラ:Borland C++ 5.5.1 for Win32
ttp://homepage2.nifty.com/jr-kun/hidemaru_qa/make_dll.html#intro
上記のサイトを参考に秀丸エディタで利用できる「hello world!」を表示するDLLを作る方法を勉強しています
hidemaru.cというファイルに以下の内容を書きました↓
#define HIDEMARU_MACRO_DLL __declspec(dllexport)
HIDEMARU_MACRO_DLL /* __declspec(dllexport) */
LPCSTR hello(void) /* LPCSTR は const char* の typedef */
{
return "hello world!";
}
コマンドラインから「bcc32 -WD -hello_world.dll hidemaru.c」と打ったのですがエラーになってdllが作成されません
エラー内容→bcc32 -WD -hello_world.dll hidemaru.c
どのように修正したらdllが作れるのかどなたかご教示お願いします
204デフォルトの名無しさん:2010/02/06(土) 16:23:19
さあ、エラー内容を再掲する作業に戻るんだ↓
205デフォルトの名無しさん:2010/02/06(土) 16:24:21
206デフォルトの名無しさん:2010/02/06(土) 18:45:45
>>203
#include <windows.h>
207デフォルトの名無しさん:2010/02/06(土) 20:18:23
void *malloc_e( size_t size, char *name )
{
char *str;
void *buf;

buf = (void*) malloc( size );
if ( buf == NULL ) {
str = strerror( errno );
fprintf( stderr, "malloc failed (%s): %s\n size: %d\n", name, str, size );
exit( EXIT_FAILURE );
}
return( buf );
}

のとこで
malloc failed (left): Not enough space
size: 7064

ってでたんだけど容量不足?
208デフォルトの名無しさん:2010/02/06(土) 20:35:44
>>207
おそらく容量不足なんだろうね
もしくはメモリ管理してる部分を破壊したか
209203:2010/02/06(土) 20:44:44
>>204-206
エラー貼り付け忘れましたすみませんでした。

大変分かりやすいソースコードをアップしてくださり頂きありがとうございました。
頂きましたソースコードを元に勉強してみます
210デフォルトの名無しさん:2010/02/06(土) 21:50:40
>ポインタ型は、明示的にキャストすることで、非常にユニークな使い方ができます
>C/C++ 言語の経験者にとっては、お馴染みの作業かもしれませんが
>Java から C# 言語に移行してきた人であれば、ポインタの威力を肌で感じることでしょう

voidのポインタを調べていたら、こんな記事を発見
これでは偉そうな事を言っているけど、Javaとか.netのobjectと同じなんですよね?
無理やりObjectクラスを作っているような気がする
211デフォルトの名無しさん:2010/02/06(土) 21:56:50
>>207
だけど、sizeが大きすぎるのが問題?小さすぎるのが問題??
212デフォルトの名無しさん:2010/02/06(土) 22:37:21
1 それ以前に沢山mallocした。
2 それ以前にメモリアロケータが管理用に使用している領域を破壊した。

オレの勘では2
213デフォルトの名無しさん:2010/02/06(土) 22:48:46
>>212
1だとfree()つかってれば開放してれば問題ない??
2は解決策ありますか?
214デフォルトの名無しさん:2010/02/06(土) 22:52:06
バグを取り除く
215デフォルトの名無しさん:2010/02/07(日) 02:22:53
今時のOSにメモリ容量を考えればメモリ領域の不足にmallocエラーはあまり考えにくいよな
95とかNTの時代には結構あったけど
216デフォルトの名無しさん:2010/02/07(日) 03:11:26
>>210
Object型ってメモリ・マップドI/Oに利用出来るの?
217デフォルトの名無しさん:2010/02/07(日) 03:27:08
>>215
リアルタイム系OSの場合は規定時間以内に処理が出来なかった
場合はtime_outフラグを設定してエラー値を返すように
拡張されている標準関数も多いです。
mallocもその例外ではなく、指定時間以内にallocに成功しなかった
(システムがディスクスワップやI/Oで忙しい時とか)場合は
NULLが返ってくるでしょう。これは勿論メモりが不足している
という意味ではありません。暫く待ってからリトライして
くれという意味になります。
218デフォルトの名無しさん:2010/02/07(日) 09:40:38
>>217
質問スレッドであって知識をひけらかすスレッドじゃない。
元質問者のレベルを推測して発言しようね。
219デフォルトの名無しさん:2010/02/07(日) 10:21:32
>>217 へー。それ何ていうOS?
標準ライブラリと同じ名前で動作が違う関数なんて使いにくそう。
220デフォルトの名無しさん:2010/02/07(日) 11:22:03
>>217
使う側から見れば便利だけど、カーネルの中のつくりは大変そうだ。
タイムアウトになったら、そこまでのカーネルの中の処理は全部
キャンセルなんでしょ?
ロックの粒度が荒くなって、ヘタするとこの仕様自体が処理遅延の
要因になりかねないな
221デフォルトの名無しさん:2010/02/07(日) 11:32:24
ページフォルトのキューを貯めていっても
「じゃ諦めます」てなアプリがどれくらい含まれてるかも考慮する必要があるしね
222デフォルトの名無しさん:2010/02/07(日) 11:45:05
ページフォールトというかページングなんかが起きるようじゃダメでしょ
最悪実行時間が計れない
必要なページはあらかじめ全部読み込んでおかないと
223デフォルトの名無しさん:2010/02/07(日) 12:14:45
PCでも一度にでかすぎるブロックをmallocしようとすると合計使用メモリにかかわらず失敗するよ。
いまgccで試してみたら2GBで失敗した。ちなみにWinXPで物理メモリは3.25GB。
224デフォルトの名無しさん:2010/02/07(日) 12:23:49
>>223
最初の質問をrefer
225デフォルトの名無しさん:2010/02/07(日) 12:31:41
ああ、sizeは小さかったのね。スマソ
226デフォルトの名無しさん:2010/02/07(日) 14:02:29
>>223
OS起動時に/3GBオプション設定してる?
227デフォルトの名無しさん:2010/02/07(日) 14:12:23
そりゃMSのXPx86はOS管理用に2GBのメモリ割り当ててるんだから
mallocで2GB以上割り当てようとしたらエラーになるだろ
228デフォルトの名無しさん:2010/02/07(日) 14:28:15
>>220
逆。プロセスのロジックは若干増える。
システムに協調的にしなければならない
から。システムコールする度にそれに
かかった時間もプロセスのどっかに書
かれて戻るからそれを見て処理手順
をプロセスレベルで変更できる。
229デフォルトの名無しさん:2010/02/07(日) 18:10:16
人名を配列に入れて扱いたいのですが、できなくて困っています。
name[0]="山田" name[1]="鈴木" name[3]="佐々木"
のようにしたいのですが 
初心者なので変な質問かもしれませんが、代案があれば教えていただきたいです。
230デフォルトの名無しさん:2010/02/07(日) 18:13:06
>>229
nameがcharの配列の配列であることを前提として、strcpy。
231デフォルトの名無しさん:2010/02/07(日) 18:20:30
stringつかえ
初心者はC++STLが一番。
name[0]="山田";と出来るぞ
232デフォルトの名無しさん:2010/02/07(日) 18:22:53
>>229
char name[4][10]={"渡辺","佐藤","山田","井上"};
233デフォルトの名無しさん:2010/02/07(日) 18:27:11
佐々木さんとか東さんはどうすればいいの?
234デフォルトの名無しさん:2010/02/07(日) 18:28:26
C++最高いやっほーう!!
235デフォルトの名無しさん:2010/02/07(日) 18:29:59
>>229
char *name[]={"渡辺", "鈴木", "佐々木"}; 
でいいのでは
236229:2010/02/07(日) 18:34:22
みなさん、ありがとうございました。
こんなにすぐに回答していただいて、びっくりしました(^^)
237デフォルトの名無しさん:2010/02/07(日) 19:43:19
環境 mac os
gcc -o b.exe daytimetcpcli.c でコンパイルすると下記のエラーが出てしまいます。
ソースは提供されているソースをコンパイルしたものですが、どのようにすれば
コンパイルが成功するのでしょうか?よろしくお願いいたします


In file included from daytimetcpcli.c:1:
unp.h:7:66: error: ../config.h: No such file or directory
unp.h:200:30: error: ../lib/addrinfo.h: No such file or directory
In file included from daytimetcpcli.c:1:
unp.h:214: error: redefinition of ‘struct timespec’
unp.h:294: error: conflicting types for ‘gai_strerror’
/usr/include/netdb.h:263: error: previous declaration of ‘gai_strerror’ was here
unp.h:298: error: conflicting types for ‘getnameinfo’
/usr/include/netdb.h:272: error: previous declaration of ‘getnameinfo’ was here
unp.h:302: error: conflicting types for ‘gethostname’
/usr/include/unistd.h:451: error: previous declaration of ‘gethostname’ was here
unp.h:318: error: conflicting types for ‘inet_ntop’
/usr/include/arpa/inet.h:99: error: previous declaration of ‘inet_ntop’ was here
238デフォルトの名無しさん:2010/02/07(日) 19:51:04
>unpv12e.tar.gz を持ってきて試してみたところ…README にやり方が
>ちゃんと書いてありますがな。ドキュメントはちゃんと読みましょう。
> % ./configure
> % cd lib
> % make
> % cd ../intro
> % make daytimetcpcli
>でうまくいきました。
239デフォルトの名無しさん:2010/02/07(日) 21:08:26
配列をサブルーチンに送りたいのですが、
スタイルキャストが必要
とか言って、エラーが出てきてしまいます・・・。
この場合はどうしたら良いんでしょうか?
240デフォルトの名無しさん:2010/02/07(日) 21:19:16
ソースを出せ
241デフォルトの名無しさん:2010/02/07(日) 22:36:36
いやです。醤油じゃだめ?
242デフォルトの名無しさん:2010/02/07(日) 23:27:29
fpos_t についてですが、ファイルに変更を加えなければ、何度ファイルを開いても
同じ fpos_t値 は常に同じところを指すのでしょうか? おしえてください。
243デフォルトの名無しさん:2010/02/07(日) 23:31:13
>>238
すみません。その操作はいったいなにをしているのでしょうか?
244デフォルトの名無しさん:2010/02/07(日) 23:42:35
うわー
245デフォルトの名無しさん:2010/02/08(月) 01:17:10
>>242
いいえ
246デフォルトの名無しさん:2010/02/08(月) 07:26:05
>>243
わかんないなら、あきらめれ
247デフォルトの名無しさん:2010/02/08(月) 08:14:20
>>243
ここみて、わかんないなら、ほんとうにあきらめれ
ttp://www7b.biglobe.ne.jp/~tsu/mac/unpv12e.html
248デフォルトの名無しさん:2010/02/08(月) 12:41:53
スティーヴンス本は、プログラマのバイブルだよな
249デフォルトの名無しさん:2010/02/08(月) 13:44:43
猫プロでウィンドウが閉じません
http://www.kumei.ne.jp/c_lang/sdk/sdk_10.htm

if(id == IDYES)
{
if(KillTimer(hWnd, ID_MYTIMER) == TRUE)
{
}
 DestroyWindow(hWnd);
}

どちらか片方をコメントにすると閉じるのですが、なにがまずいんでしょか
250デフォルトの名無しさん:2010/02/08(月) 14:25:05
猫の話をここでするな
251249:2010/02/08(月) 14:35:35
ごめんなさい
252デフォルトの名無しさん:2010/02/08(月) 14:38:58
Solarisたんの mkfile コマンドを、遊びでLinuxに移植しようと
思うのだが、zero埋めってどうやればベストなのかな?

zeroのバッファを用意してwriteしまくる、だと遅いのかな。
truncate(2) の方がいい?

# いや head とか dd 使えばいいだろ、とか言わないで ><
253デフォルトの名無しさん:2010/02/08(月) 14:42:24
lseekして最終ブロックだけ書く。
254デフォルトの名無しさん:2010/02/08(月) 14:44:27
>>253
あ、それいいね。じゃあそうするわ。
ありがとう。
255デフォルトの名無しさん:2010/02/08(月) 16:53:05
この世界の害悪にまみれ
僕は悲しみをためる
それを癒すのは貴女だけ
朝に、昼に、夕に、夜に
僕は貴女を称えよう

奇跡の降り積もる日を待ち望み
余すことなくこの身の全ては
貴女に捧げられる供物である
どんな暗闇が僕を遮ろうとも
やがて貴女に辿り着くだろう
深き愛情の奇跡の証に

羊のように従順に尽くす僕の魂
僕は貴女に恋をしてしまいました。
いかなる誘惑も貴女への愛情を
揺るがすことはないでしょう
私は貴女のことを愛しています。

御返事お待ちしています。
256デフォルトの名無しさん:2010/02/08(月) 18:23:04
>>240
すいません寝てました・・・。
 
 
ソースを貼り付けたいのですが、
32行じゃ収まりきれません。
どこかソースを上げるサイトとかあったはずなのですが、
どこか教えていただきたいです。
257デフォルトの名無しさん:2010/02/08(月) 18:39:11
codepad.org
258デフォルトの名無しさん:2010/02/08(月) 19:17:13
すいません眠くなりました...
寝てからうpします。ごめんなさい
259デフォルトの名無しさん:2010/02/08(月) 19:19:54
どんだけ寝るんだよw
260デフォルトの名無しさん:2010/02/08(月) 19:24:44
ナルコレプシーだな
261デフォルトの名無しさん:2010/02/08(月) 19:41:42
SIZEを初期化しようとして
SIZE size=SIZE(0,0);
と書いたエラーになりました。
size.cx=0;
size.cy=0;
と2行で書くのではなく、1回で初期化を記述するのはどう書けばいいですか。
262デフォルトの名無しさん:2010/02/08(月) 19:43:03
>>261
SIZE size={0,0};
263デフォルトの名無しさん:2010/02/08(月) 20:05:02
>>261 Cをやめて、C++を使う。
264デフォルトの名無しさん:2010/02/08(月) 20:19:52
>>263
お帰りください
265デフォルトの名無しさん:2010/02/08(月) 20:52:07
>>240
ソース上げました

 http://codepad.org/Y31Tv06I
 

あれから色々手を加えてみましたが、
まだエラーが直りません
 
 
このプログラムはハノイの塔のプログラムです
 
http://www.pref.fukushima.jp/pc-concours/2009/03/03_reidai02q.html
 
解いている問題はこれです。
 
 
このプログラムのどこがいけないでしょうか?
266デフォルトの名無しさん:2010/02/08(月) 20:59:12
>>265
2行目と20行目の引数が違う。
3と53、4と71、5と86も違う。
ぜんぜん違う。
なんで
int,int);
って宣言しておいて、
int lend,int hanoi[300]){
にしちゃってるの?
267デフォルトの名無しさん:2010/02/08(月) 21:13:29
>>266
どういう意味ですか?


つまりどこが悪いと仰ってますか?
268デフォルトの名無しさん:2010/02/08(月) 21:18:02
お前の頭が悪い
269デフォルトの名無しさん:2010/02/08(月) 21:19:08
>>268
ソースの中での指摘をお願いします
270デフォルトの名無しさん:2010/02/08(月) 21:20:17
汚ねぇww
271デフォルトの名無しさん:2010/02/08(月) 21:23:14
>>270
あまり書き慣れないので・・・。
すいません
272デフォルトの名無しさん:2010/02/08(月) 21:28:41
もっと基礎からやり直せw
273デフォルトの名無しさん:2010/02/08(月) 21:43:59
>>271
(1) プロトタイプ宣言(2〜5行め)と、実際の定義(20行め、53行め,…)の引数の型が一致していない
定義の方が正しいのなら、
int move(int,int,int,int,int,int,int,int,int,int,int,int *);
とでもする。

(2)38行めなどでkui2()などを呼び出す際、最後のパラメータとしてhanoi全体を渡したいのなら
kui2(d,e,f,n,m,l,z,lena,lenb,lenc,lend,hanoi);
とする。

(3)kui3()のelseの閉じ括弧'}'がない

以上を直すと、一応コンパイルは通るけど暴走する。
274デフォルトの名無しさん:2010/02/08(月) 21:57:37
面白い解き方だとは思うが
個人的には hanoi[300] よりも hanoi[3][100] にして欲しい
275デフォルトの名無しさん:2010/02/08(月) 22:04:58
>>271
初心者のソースが汚いのは当然のことだから恥じることはない。
ただ一般的に「自分だけが理解できるソース」には価値が無いということを覚えればいいよ。
276デフォルトの名無しさん:2010/02/08(月) 22:17:04
>>271
引数を多くしすぎると、後で後悔するよ
277デフォルトの名無しさん:2010/02/08(月) 22:23:06
> 自分だけが理解できるソース

自分しか読まないコードはそれでいい
「初心者」は仕様そのものさえ憶えればいい
それさえできていれば組織ごとに違うスタイルには対応できるし
アルゴリズムやイディオムは無数にあってライフワークになる

あんまり初期から頭を固くすることこそ避けたほうがいい
278デフォルトの名無しさん:2010/02/08(月) 22:33:55
>>265
開いた瞬間吹き出した
279デフォルトの名無しさん:2010/02/08(月) 22:38:53
爺さん達よ、パソコン甲子園目指している若人をじじいじじいといたぶるなよ
280デフォルトの名無しさん:2010/02/08(月) 22:39:35
↑くやしいのうくやしいのう
281デフォルトの名無しさん:2010/02/08(月) 22:41:28
/usr/lib/gcc/spu/4.1.1/../../../../spu/bin/ld: .bss exceeds local store range
/usr/lib/gcc/spu/4.1.1/../../../../spu/lib/crt1.o: In function `_start':
(.text+0x28): relocation truncated to fit: SPU_ADDR18 against symbol `_end' defined in *ABS* section in spe-main
/tmp/ccCjxW2K.o: In function `get_smith_waterman_score':
sample.c:(.text+0x1b8): relocation truncated to fit: SPU_ADDR18 against symbol `score' defined in COMMON section in /tmp/ccCjxW2K.o
/tmp/ccCjxW2K.o: In function `set_query_array':
sample.c:(.text+0x5bc): relocation truncated to fit: SPU_REL16 against symbol `params' defined in COMMON section in /tmp/ccCjxW2K.o
/tmp/ccCjxW2K.o: In function `set_database_array':
sample.c:(.text+0x7b4): relocation truncated to fit: SPU_REL16 against symbol `params' defined in COMMON section in /tmp/ccCjxW2K.o
/tmp/ccCjxW2K.o: In function `main':
sample.c:(.text+0x91c): relocation truncated to fit: SPU_ADDR18 against symbol `params' defined in COMMON section in /tmp/ccCjxW2K.o
sample.c:(.text+0xa88): relocation truncated to fit: SPU_ADDR18 against symbol `score' defined in COMMON section in /tmp/ccCjxW2K.o
sample.c:(.text+0xb5c): relocation truncated to fit: SPU_REL16 against symbol `params' defined in COMMON section in /tmp/ccCjxW2K.o
/usr/lib/gcc/spu/4.1.1/../../../../spu/lib/libgloss.a(sbrk.o): In function `sbrk':
/home/sur/jordics/sdk3.1/src/redhat/BUILD/spu-newlib-1.16.0/obj-spu/spu/libgloss/spu/../../../../src/libgloss/spu/sbrk.c:53: additional relocation overflows omitted from the output
collect2: ld returned 1 exit status

って意味のわからんエラーがでたのだが、なんだこれは??
282デフォルトの名無しさん:2010/02/08(月) 22:44:04
ぐぐれ
283デフォルトの名無しさん:2010/02/08(月) 22:48:42
>>281
リンカのスクリプトがおかしいんじゃないか
284デフォルトの名無しさん:2010/02/08(月) 22:51:26
>>272
そうすることにします。
とりあえずポインタの勉強をまったく勉強してなかったので
サブルーチンと一緒にポインタの勉強もするようにします
 
>>273
ありがとうございました!
一応通りますけど無限ループ状態ですね・・・。
配列自身を渡すにはポインタが必要なんですか?

>>274
二次元配列っていう方法もありましたね!
最初に配列を3つ使って考えてましたが、
その方法もいいですね。

>>275
ありがとうございます
これは練習なので自分だけが読むプログラムですが、
こういう場で質問した時にも解り易いプログラムを書けるようにします
 
>>276
最大でも、何個ぐらいの引数にした方がいいですか?
 
>>277
ありがとうございます
学ぶより真似よ、ですか。
頑張ります
285デフォルトの名無しさん:2010/02/08(月) 23:11:11
>>284
引数が5個以上ってのは、あんまり見ないけど(C++/Javaの場合)
作ってから1〜2週間すると、引数に何を渡せばいのか自分でもわからなくなるよ

int kui1()、int kui2()・・・って関数に名前を付けるのもいいけど、
普通はローマ字じゃなくて英単語を組み合わせるべき(例外を除く)
関数や変数の名前に統一感が無いと思ったら、「c言語 命名規則」とかでググってね
286デフォルトの名無しさん:2010/02/08(月) 23:17:05
>>283
すいません。もうちょっとわかりやすくお願いします。
287デフォルトの名無しさん:2010/02/08(月) 23:22:50
ある分野では引数が11個とかがのっけから出てくるが
288デフォルトの名無しさん:2010/02/08(月) 23:26:36
お前らにはFORTRANの数値演算ライブラリは使いこなせない。
289デフォルトの名無しさん:2010/02/08(月) 23:27:20
>>286
http://pc12.2ch.net/test/read.cgi/tech/1249915266/
ここで、質問しなおしたら
290デフォルトの名無しさん:2010/02/08(月) 23:44:09
>>287
それは特別な分野じゃまいか?
普通のプログラミングで11個は現実的じゃないと思うんだけど
291デフォルトの名無しさん:2010/02/09(火) 00:00:55
>>288
村人A「C言語の村へようこそ」
292デフォルトの名無しさん:2010/02/09(火) 00:57:15
削れん引数を五個くらい持った関数が出てきた辺りで構想間違いを探しに過去への旅に出る
293デフォルトの名無しさん:2010/02/09(火) 01:06:59
>>291
学が無いな。Cからも使えるんだぜ。
294デフォルトの名無しさん:2010/02/09(火) 01:58:37
>>292
そこで精神分裂を起こすのが日本人の克服すべき弱点だ
信じた道は並み居る論敵を蹴散らして我が道を歩み頂で血化粧のβエンドルフィンに酔え

引数34個がどうした! 何か悪いのか、えーおいチビ、ぶっ殺すぞてめえ!! これができないからナメられるんだよ
295デフォルトの名無しさん:2010/02/09(火) 03:18:51
引数が5個以上になったら普通は構造体とか使ってまとめるもんだろ
その方がオーバーヘッドも小さくなるしソースも読みやすくなるし
それができなきゃ設計ミスだ
296デフォルトの名無しさん:2010/02/09(火) 03:36:25
3次元座標3点の重心を求める関数を作成せよ

構造体?わかんねーからx1,y1,z1...でいいか
戻り値で構造体を受け取るにもよくわかんねーから引数にポインタでいっか

void getgrav3(float *x,float *y,float *z,float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3);
297デフォルトの名無しさん:2010/02/09(火) 03:43:17
設計ミスじゃなくてプログラマーのレベルが低すぎただけだったなんて!
298デフォルトの名無しさん:2010/02/09(火) 11:06:20
そりゃパソコン甲子園(笑)だもんな。
299デフォルトの名無しさん:2010/02/09(火) 12:45:46
全部グローバル変数にするよりはマシ
300デフォルトの名無しさん:2010/02/09(火) 13:10:39
>>299
パフォーマンス上の理由でそうすることはあるよ。
301デフォルトの名無しさん:2010/02/09(火) 13:26:57
でも基本は「安易にグローバル変数にするな」だろ
302デフォルトの名無しさん:2010/02/09(火) 13:36:36
ゲーム屋にはよくある事
303デフォルトの名無しさん:2010/02/09(火) 13:57:12
デバグや障害原因調査をやりやすくするためにグローバル変数使うこともあるけど、
入門編で初心者にする話じゃないな
304デフォルトの名無しさん:2010/02/09(火) 14:07:31
完成品が大事。
念仏のように、使うなっていうのは良くない。
生産性・効率次第。
グループで変数が統一して理解していて、マルチスレッドで
アクセス済んでなければ、関数の引数や戻り値が減らせて
良いこともある。
305デフォルトの名無しさん:2010/02/09(火) 14:09:42
クラス内変数や配列も
クラスを外せばグローバル。
クラス内のグローバル。
共通して使う変数はクラス化するのが良いとは思うが
306デフォルトの名無しさん:2010/02/09(火) 14:18:44
>>304>>305
>>265に対する助言として、それが適切だと思うの?
307デフォルトの名無しさん:2010/02/09(火) 18:17:51
ファイルポインタをメインで定義して、サブルーチンでオープンしているプログラムです。
下のfile1.c , file2.c , file3.c を結合して実行したところメモリを壊してるようなエラーが出てしまうのですが原因はなんでしょうか?
「file1.c」
extern int file2(FILE*)
extern int file3(FILE*)

int main(void)
{
___FILE *fp;
___file2(fp);
___file3(fp);
___return 0;
}

「file2.c」
int file2(FILE* fp)
{
___fp=fopen("test.txt","w");
___fprintf(fp,"テスト1");
___return 0;
}

「file3.c」
int file3(FILE* fp)
{
___fprintf(fp,"テスト2");
___fclose(fp);
___return 0;
}

308デフォルトの名無しさん:2010/02/09(火) 18:22:04
ポインタのポインタ
309デフォルトの名無しさん:2010/02/09(火) 18:25:14
extern FILE* file2(FILE*)

fp=file2(fp);
310デフォルトの名無しさん:2010/02/09(火) 18:57:34
>>307
> 下のfile1.c , file2.c , file3.c を結合して実行したところメモリを
> 壊してるようなエラーが出てしまうのですが原因はなんでしょうか?

main()で定義されたfpが、file2()によって更新されないから。
正しくは、

int main(void)
{
___FILE *fp;
___file2(&fp);
___file3(&fp);
___return 0;
}

int file2(FILE** fp)
{
___*fp=fopen("test.txt","w");
___fprintf(*fp,"テスト1");
___return 0;
}

など。
311デフォルトの名無しさん:2010/02/09(火) 19:18:14
>>308-310
ありがとうございます動きました!

>>309
試したんですが実行エラーでした。。
312デフォルトの名無しさん:2010/02/09(火) 22:49:00
FILE *fp = NULL;
char buffer[16] = "";

のように、常にNULLや空文字列で初期化するのって意味ありますか?
313デフォルトの名無しさん:2010/02/09(火) 22:54:53
バカ除けのお札
314デフォルトの名無しさん:2010/02/10(水) 00:11:51
>>312
NULLで初期化は realloc をループで使うときに有効
315デフォルトの名無しさん:2010/02/10(水) 16:46:33
どう便利なんだろ
316デフォルトの名無しさん:2010/02/10(水) 16:55:50
>>312
nullポインタを使った書き込みは例外が出るけど、ランダムに初期化された場合はそうでない場合がある。
317デフォルトの名無しさん:2010/02/10(水) 17:00:47
二重にfreeするのを防げる。
一回freeしたものをあとでfreeしてると、
意外なタイミングでおかしくなるので見つけにくいバグになる。
318デフォルトの名無しさん:2010/02/10(水) 17:22:00
ポインタを返す関数内で、一度も設定しないまま返るケースがある時は必須だべ
319デフォルトの名無しさん:2010/02/10(水) 22:53:36
やっぱりバカ避けってことだな
320デフォルトの名無しさん:2010/02/10(水) 23:10:08
初期化でNULLを設定してしまうと、コンパイラが初期化しないパスがあるという警告を出してくれなくなるので、そのNULL設定自体に意味があるのでなければ、設定すべきではない。
321デフォルトの名無しさん:2010/02/10(水) 23:10:52
警告以前にバカコードを書く者の脳をデバッグすべき
322デフォルトの名無しさん:2010/02/11(木) 00:21:41
>>321
君のことか
323デフォルトの名無しさん:2010/02/11(木) 00:22:30
>>320のことだ
324デフォルトの名無しさん:2010/02/11(木) 00:30:19
>>322のこと
325デフォルトの名無しさん:2010/02/11(木) 19:24:40
>>317がアホ過ぎる
326デフォルトの名無しさん:2010/02/11(木) 19:54:12
>>325
多分キミがアホなんだと思う。

ポインタのスコープ抜けるときに
if (p) free(p);
と言うつもりなのだろう。
327デフォルトの名無しさん:2010/02/11(木) 20:09:32
free(p)してもpにNULLは入らないと思うが
328デフォルトの名無しさん:2010/02/11(木) 20:10:34
「スコープ抜けるとき」と書いただろ。
329デフォルトの名無しさん:2010/02/11(木) 20:12:14
if (p) {
free(p);
p = NULL
}

って安全なの?
330デフォルトの名無しさん:2010/02/11(木) 20:15:21
書いた奴に聞いた方がいい
331デフォルトの名無しさん:2010/02/11(木) 20:15:31
>>329
そういう習慣がないではないことは理解できますが、一方で *p する前にはかならず null チェックしないと意味がないし、それもしんどい作業だなあ。
332デフォルトの名無しさん:2010/02/11(木) 20:16:12
>>329
普通はマクロdeleteを使う
delete p;
333デフォルトの名無しさん:2010/02/11(木) 20:16:45
「NULLで初期化」と>>317は関係ないような
334デフォルトの名無しさん:2010/02/11(木) 20:17:54
>>332
そのdeleteの定義を見せてみろ。
335デフォルトの名無しさん:2010/02/11(木) 20:38:17
>>312
意味が無いっていうか、マイナスだよね。
本当の初期化を忘れたときに、警告がでなくなる。
336デフォルトの名無しさん:2010/02/11(木) 20:42:36
C99やJavaみたいに、変数の宣言が自由なところでできる言語なら、
使う直前で、宣言&初期化。

C89みたいに、ブロックの先頭でしか宣言できない言語なら、
使う直前で初期化。
(って書くと、文法上の初期化と代入がどうこうって、あさっての
方向に話題を持っていくやつが現れるのが、いつの流れだけど)
337デフォルトの名無しさん:2010/02/11(木) 21:14:51
>>336
明後日も何も質問の>>312がその「文法上の初期化」についてでは・・・

さておき、離れて使う場合でも宣言時の初期化で良いと思うよ。
むしろそれで把握しづらくなるほど長い関数を作る方が問題かと。

まぁこの辺は文化の差なんじゃないの?
338デフォルトの名無しさん:2010/02/11(木) 21:19:54
>>337
それじゃ、コンパイラに指摘してもらえない。
その論理なら、関数を短くすればすべてのバグがなくなる。
339デフォルトの名無しさん:2010/02/11(木) 21:20:00
いつでも全部初期化するのは反対
必要な分だけでないとデバッグ時に
初期値のチェックからはじめなきゃならなくて面倒
340デフォルトの名無しさん:2010/02/11(木) 21:21:47
char *p = NULL;
p = malloc(1);
とか、ふつーに見限られるコードだしな
341デフォルトの名無しさん:2010/02/11(木) 21:23:29
ポインタだけは初期値NULLがいいな
342デフォルトの名無しさん:2010/02/11(木) 21:25:03
>>337
「常にNULLや空の値で初期化」って、機械的にそうするってコーディングスタイルの
ことでしょ?
(違うならいいけど)

そういう文化があるってのは知ってるけど、相対文化論じゃないし優劣なしって
ことはないよ。

小さい関数しか書かないから、どこで初期化しても同じって話しなら、
for (i = 0; i < N; i++)
とかしないで、
int i = 0;

for (; i < N; i++)
とか書いてもOKみたいな話になっちゃうでしょ。
343デフォルトの名無しさん:2010/02/11(木) 21:26:41
>>340
あんまりふつーじゃないと思うよ。
344デフォルトの名無しさん:2010/02/11(木) 21:27:49
>>342
for については意味付けを考えて欲しいな
345デフォルトの名無しさん:2010/02/11(木) 21:37:02
>>343
意味わかめ
346デフォルトの名無しさん:2010/02/11(木) 21:38:30
>>340
必要がないと思うのですけれども。
347デフォルトの名無しさん:2010/02/11(木) 21:42:33
>>346
???
それ文句か?
348デフォルトの名無しさん:2010/02/11(木) 21:42:44
>>345
有名なプロダクツでそういうスタイルが採用されているとか、
著名な人とか定番みたいになってる書籍で、そういうスタイルが
薦められてるとか、ないんじゃないの?
349デフォルトの名無しさん:2010/02/11(木) 21:53:18
>>348
まあ有名なムやマに凶悪さでも有名なのはあるが
たとえその本人であっても突っ込んで帰ってきた返事がクソなら
ブランドに係わらずその議論に対する評価はクソだが
350デフォルトの名無しさん:2010/02/11(木) 22:52:17
>>342
すまん。言葉が足らんかった。
無意味な初期化はしてはいけないと考えてるよ。
害にしかならない。

forは、自分ではそんな書き方はしないけど、
積極的に直させる程の事もないと思う。
for文の存在意義の半分を捨ててる以外は、
問題あるように見えない。
351デフォルトの名無しさん:2010/02/12(金) 14:14:31
static変数って0で初期化される?
352デフォルトの名無しさん:2010/02/12(金) 14:24:27
される
353デフォルトの名無しさん:2010/02/12(金) 14:48:44
誰に?
354デフォルトの名無しさん:2010/02/12(金) 14:53:46
パソコンに
355デフォルトの名無しさん:2010/02/12(金) 15:19:51
されねーよw
356デフォルトの名無しさん:2010/02/12(金) 15:59:38
ふと思ったんだが、ゼロ梅されたページをプロセスに割り当てる
実装があれば...
357デフォルトの名無しさん:2010/02/12(金) 16:12:42
今は、それ多いんじゃない。
358デフォルトの名無しさん:2010/02/12(金) 16:13:08
あ、まじで?
359デフォルトの名無しさん:2010/02/12(金) 16:14:06
>>356
>>350によると無意味な初期化なので禁止。
360デフォルトの名無しさん:2010/02/12(金) 16:15:14
>>355
されるだろ
ポインタ型でなければ
361デフォルトの名無しさん:2010/02/12(金) 16:16:19
理由は、セキュリティ上の問題なんだけどな。
362デフォルトの名無しさん:2010/02/12(金) 16:29:23
>>355
規格票読んでこい
363デフォルトの名無しさん:2010/02/12(金) 17:54:15
>>355
static な変数は 0 に初期化されますね。
364デフォルトの名無しさん:2010/02/12(金) 17:59:49
初期化されるのかよ
でも気持ち悪いから初期化するよな
365デフォルトの名無しさん:2010/02/12(金) 18:02:28
>>364
それは単に無知なだけ
366デフォルトの名無しさん:2010/02/12(金) 18:03:58
>>360
ポインタ型も NULL (= 0) に初期化されます。
367デフォルトの名無しさん:2010/02/12(金) 18:05:26
文脈をおもいっきり無視だな w
368317:2010/02/12(金) 18:09:54
なんかいろいろすまない。>>333さんだけが正解w
「初期化」じゃなくて、freeの後の「代入」の話をしてたね俺は。
369デフォルトの名無しさん:2010/02/12(金) 20:29:18
>>366
すまん。規格をしっかり見ていないので知りたいのだが、↓はどちらが正しい?
0で初期化? NULLで初期化?
370デフォルトの名無しさん:2010/02/12(金) 20:55:40
>>369
どちらかが正しいですよ。
371デフォルトの名無しさん:2010/02/12(金) 20:58:24
mallocして使用するポインタはNULLで初期化することが多いかなぁ
スタイルにもよるけど、関数の途中で失敗した場合にgotoで関数の出口に飛んでfreeしたい場合に、
err:
free(p0);
free(p1);
....
return -1;
のように複数のポインタ変数を一括してfreeで記述できるのでわかりやすい。
freeする順序に気をつかったり、err0, err1みたいにくだらないラベルも増えない。
372デフォルトの名無しさん:2010/02/12(金) 21:04:26
>>369
「静的記憶域期間を持つオブジェクトを明示的に初期化しない場合
そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。」
373デフォルトの名無しさん:2010/02/12(金) 21:10:59
null pointerを表すビットパターンで初期化される
0(整数値0を表すビットパターン)かもしれないし、0でないかもしれない
大抵の環境では0だけどね、しかしながら、0でない環境もあるので>>369どっちも間違え

ISO/IEC 9899:1999 (E) C99でごめんね
6.7.8 Initialization
10 If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static storage duration is not initialized explicitly,
then:
― if it has pointer type, it is initialized to a null pointer;

ついでにnull pointer
6.3.2.3 Pointers
3 An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant .55) If a null pointer constant is converted to a
pointer type, the resulting pointer, called a null pointer , is guaranteed to compare unequal
to a pointer to any object or function.
4 Conversion of a null pointer to another pointer type yields a null pointer of that type.
Any two null pointers shall compare equal.
55) The macro NULL is de?ned in <stddef.h> (and other headers) as a null pointer constant; see 7.17.

どんな値なのかはわからないけど、少なくともオブジェクト(変数)や関数のポインタとは一致しない値を表す特別なポインタ
プログラム上は0か(void *)0で表現できる、またはNULL
374デフォルトの名無しさん:2010/02/12(金) 21:12:27
>>372
あっそ
375デフォルトの名無しさん:2010/02/12(金) 21:17:18
C++0xのnullptrにすればすっきりしていいな
376デフォルトの名無しさん:2010/02/12(金) 21:20:33
>>372, 373
ありがとう。
早い話が「空気読んで初期化」してくれるということでOKか
つまり、構造体を ={0}で初期化するのと一緒の挙動かな
377デフォルトの名無しさん:2010/02/12(金) 21:22:56
だよ
378デフォルトの名無しさん:2010/02/12(金) 21:24:04
>>376
いや、それは又別のセマンティクスがあってだな

「空気を読んで初期化」か、なかなか面白い表現だな
今度使わせていただきます
379デフォルトの名無しさん:2010/02/12(金) 21:37:13
面白い表現ですね
380デフォルトの名無しさん:2010/02/12(金) 21:42:25
なんのためにわざわざNULLというキーワードを使っているのか?
0と決まっているなら0でいい。そうじゃないからNULLという文字列に置き換えている。
381デフォルトの名無しさん:2010/02/12(金) 22:03:18
ホントそうだよなw
なんのためにわざわざNULLというキーワードを使っているのか?
382デフォルトの名無しさん:2010/02/12(金) 22:05:33
>>381
キーワード?
383デフォルトの名無しさん:2010/02/12(金) 22:23:31
>380, 381
はぁ?別に0でいいよ、でも64bitとかだと0Lかな
void *にキャストしていてもいいけど
384デフォルトの名無しさん:2010/02/12(金) 22:37:41
みんなC FAQのNULLポインタの章を読んどいてね
http://www.kouno.jp/home/c_faq/c5.html#0
385デフォルトの名無しさん:2010/02/12(金) 22:38:59
>384
はぁ?
386デフォルトの名無しさん:2010/02/12(金) 22:48:55
>384
今さら感があるなぁ
まぁ、当たり前のことを当たり前のようにかかれているだけだし特にこれといって読むに値する内容でもない
387デフォルトの名無しさん:2010/02/12(金) 23:17:51
そらお前さん、ここは入門スレだし、>>380みたいな奴も居るんだから
388デフォルトの名無しさん:2010/02/12(金) 23:25:14
ソース上ではヌルポインターは0で決まっていて、NULLはいらない子だったんですね。
勉強になりました。
389デフォルトの名無しさん:2010/02/12(金) 23:55:55
可読性では
(ポインタ)=NULL
って書いたほうがいいと思うけど
390デフォルトの名無しさん:2010/02/13(土) 00:06:44
つまらん事にこだわる奴はLISPでも弄ってなさいって話だ
391デフォルトの名無しさん:2010/02/13(土) 00:21:36
glibcとgccを使ってコードを書いています
「to_aru_name」という名前の関数内のエラーメッセージを表示するときに、

to_aru_name (void *arg)
{
const char *func = "to_aru_name"
...
fprintf(stderr, "%s(): hoge failed: %s", func, strerror(errno));
...
}

と書いて、実際のエラーメッセージを「to_aru_name(): hoge failed: File exists」
のように表示させてるんですが、関数毎に「const char *func = "to_aru_name"」の部分を
準備する必要があり手間がかかります。この部分を自動化したい…
funcに関数名を自動的に代入or設定する良い方法はないでしょうか?
便利なマクロとか、もしかしてあったりするかな…
392デフォルトの名無しさん:2010/02/13(土) 00:29:34
__FUNCTION__
393デフォルトの名無しさん:2010/02/13(土) 00:29:43
>>390
つまらん事言ってないで>>391に答えてやりなさい
394391:2010/02/13(土) 00:42:49
>>392
ありがとおおおお
printf("func: %s\n", __FUNCTION__);
で確認できた。ちゃんと""付きで展開されるのね…
395デフォルトの名無しさん:2010/02/13(土) 00:53:37
__FILE__でフルパスがバイナリに入らない方法ってありますか
ファイル名だけで良いのにVCもGCCも入ってしまうのですが…
396デフォルトの名無しさん:2010/02/13(土) 01:19:08
>>394
俺はお礼を拒否する主義だ
397デフォルトの名無しさん:2010/02/13(土) 01:21:47
>>396
テメー、答えたのはオレだ。
398デフォルトの名無しさん:2010/02/13(土) 01:29:14
私です
399デフォルトの名無しさん:2010/02/13(土) 01:31:01
こんなところで成りすまして、なんの得があるんだか。
400デフォルトの名無しさん:2010/02/13(土) 01:31:15
>>394
オレはオレを拒否する主義だ
401デフォルトの名無しさん:2010/02/13(土) 01:37:15
LISPはいいよ〜
変なのはS式だけで
あとは君の思うがままに操れる
素晴らしい言語だ。
402デフォルトの名無しさん:2010/02/13(土) 03:10:05
printf(NULL);
と書いていると、コンパイルするときにgccが
「warning: null argument where non-null required (argument 1)」
みたいに、NULLであってはいけない引数がNULLですよと警告してくれるけど、
自分でつくった関数でも同じ警告が出るようにできるかな?

int
my_func(const char *str)
{
...
if (str == NULL)
return -1;
...
}
上のように引数がNULLの場合をチェックしているのだけど、
実行時だけじゃなくてコンパイルするときにも「NULLはダメだ!」と警告されるようにできないものでしょうか?

この関数をライブラリにして使うときに、引数がNULLだとコンパイル時に警告させるようにしたい…
403デフォルトの名無しさん:2010/02/13(土) 03:12:45
404デフォルトの名無しさん:2010/02/13(土) 08:49:35
>>402
5.25 Declaring Attributes of Functions

`nonnull (ARG-INDEX, ...)'
The `nonnull' attribute specifies that some function parameters
should be non-null pointers. For instance, the declaration:

extern void *
my_memcpy (void *dest, const void *src, size_t len)
__attribute__((nonnull (1, 2)));
405デフォルトの名無しさん:2010/02/13(土) 09:34:38
402じゃないけど参考に成ったよ。
406デフォルトの名無しさん:2010/02/13(土) 09:39:33
>>395
あんまり意味なさげだけどVC2005辺りだと
リリースビルドの時はフルパスじゃなくなった気が・・・
407デフォルトの名無しさん:2010/02/13(土) 12:46:36
408デフォルトの名無しさん:2010/02/13(土) 12:48:46
教材を買われたか方の中にはこんな非常識な人も居ますwwwwww
http://rating6.auctions.yahoo.co.jp/jp/show/rating?userID=yovrin&filter=-1
409デフォルトの名無しさん:2010/02/13(土) 12:56:21
C#→C++に移るのは大変なのか?

C/C++からC#は派生したが、まったく別の言語
っていう話を聞いたんだが。

C#で打つと、.NETが必要になるから移ろうかと思っていたんだが。
410デフォルトの名無しさん:2010/02/13(土) 12:59:49
> C#で打つと
斬新な表現だな。
411デフォルトの名無しさん:2010/02/13(土) 13:00:53
言語としては同程度の難易度だろ。
C++はアプリ開発には向いてないがな。生産効率は悪い。
C#で10行で済むことが100行-1000行になり得る。
標準部品の品揃えが悪い。
412デフォルトの名無しさん:2010/02/13(土) 13:05:07
>>411
チッうるせーな 反省してまーす
413デフォルトの名無しさん:2010/02/13(土) 13:07:37
高すぎて笑える

僕なら
http://www.amazon.co.jp/dp/0393979504
をお薦めする
414デフォルトの名無しさん:2010/02/13(土) 13:07:49
それをC++のスレではなくCのスレで聞くとはいい度胸だな。
あまり先入観を持たずに別言語だと思ってやれば、いいんじゃないの?

C#みたいにライブラリやIDEの充実がない分面倒。
そこを差し引けば、そんなに悪くはないと思う(歴史が長い分良くないとこも多い)。
415デフォルトの名無しさん:2010/02/13(土) 13:32:07
>>409
「.NETが必要になるから」移りたいというのはちょっと理解できない。目的から必要性を考えたほうが良いかも。
文法レベルの移行はそれほど大変ではないはずだが、C++の機能をたくさん使いたいなら大変時間がかかると思う。
そもそもC++を使う必要あるのか?単にカッコいい(人によっては他人が読みつらい)コードを書きたいなら話は別だが。
416デフォルトの名無しさん:2010/02/13(土) 14:08:34
こんにちは、質問があってきました。
私は今、ある計算をするプログラムを組んでいるのですが、double変数を使用しても、変数がオーバーフローする可能性が高い計算を行っています。
オーバーフローすることは一向に構わないのですが、そのあとでオーバーフローしたかどうかの判定をしたいのです。
Cではどうやればオーバーフローしたかどうかの判定ができるのでしょうか?
尚、使用可能なヘッダーファイルはstdio.hのみでお願いします。
417デフォルトの名無しさん:2010/02/13(土) 14:13:10
float.hもつかわずに浮動小数点数の状態を調べるってか?
418デフォルトの名無しさん:2010/02/13(土) 14:13:16
コンパイラが対応してないと無理では。
桁落ち、情報落ち、最大最小値越えなど検出する方法はないだろ。
デバッグモードで付いてれば付いてる。
419デフォルトの名無しさん:2010/02/13(土) 14:14:56
任意精度のGMP使えよ
420デフォルトの名無しさん:2010/02/13(土) 14:28:31
オーバーフローしたらINFになるんじゃね
421デフォルトの名無しさん:2010/02/13(土) 14:29:08
そうなのか
422デフォルトの名無しさん:2010/02/13(土) 14:29:19
doubleって、オーバーフローしたら特殊な値にならないの?
NaNみたいな。
423デフォルトの名無しさん:2010/02/13(土) 14:44:49
そうだよ
424デフォルトの名無しさん:2010/02/13(土) 14:46:25
stdio.hだけでやるなら使用するCPUの浮動小数点に関するフラグやイ
ンラインアセンブラでステータスワードを設定してやる必要がある。
設定の仕方はCPUのマニュアルに書いてある。
425デフォルトの名無しさん:2010/02/13(土) 15:46:44
#define N 5
int main(void){
int i,
n = N * 32;
char *s;
s = (char *)malloc(n);
for(i = 0; i < N; ++i){
memcpy(s, &i, 4);s += 4;
memcpy(s, &i, 4);s += 4;
memcpy(s, &i, 4);s += 4;
memcpy(s, &i, 4);s += 4;
memcpy(s, &i, 4);s += 4;
memcpy(s, &i, 4);s += 4;
memcpy(s, &i, 4);s += 4;
memcpy(s, &i, 4);s += 4;
}
printf("%s", s);
free(s);
return 0;
}
これ実行すると問題発生するんだけどどうして?
426デフォルトの名無しさん:2010/02/13(土) 15:51:34
sがどこを指しているか順次紙に書いてみろ
427デフォルトの名無しさん:2010/02/13(土) 16:01:21
>>425
sは固定しておいてfree(s);とすべきなのに s+=4; を8回行って
sの値が変化している

その後 free(s); を行った結果は未定義である(鼻から悪魔)
428デフォルトの名無しさん:2010/02/13(土) 16:18:00
あと、intをmemcpy()して、printf("%s",…); とかしても
表示されない。
429デフォルトの名無しさん:2010/02/13(土) 16:21:57
memcpyとかmallocとか、基本がわかってない人に説明するのはしんどくないですか?
430デフォルトの名無しさん:2010/02/13(土) 16:26:39
#define N 5
int main(void){
  char *s, *t;
  int i;
  int m = '1'|'0'<<8|'2'<<16|'4'<<24;
  int n = N * 4 * 8;

  t = s = (char *)malloc(n);
  for(i = 0; i < N; ++i){
    memcpy(s, &m, 4);s += 4;
    memcpy(s, &m, 4);s += 4;
    memcpy(s, &m, 4);s += 4;
    memcpy(s, &m, 4);s += 4;
    memcpy(s, &m, 4);s += 4;
    memcpy(s, &m, 4);s += 4;
    memcpy(s, &m, 4);s += 4;
    memcpy(s, &m, 4);s += 4;
  }
  printf("%s", t);
  free(t);
  return 0;
}
431デフォルトの名無しさん:2010/02/13(土) 16:30:03
直すならヌル終端しろよ
432402:2010/02/13(土) 17:45:59
>>404
ありがとう、再現できました!
ttp://ja.pastebin.ca/1795118

GCCのマニュアルに書いてあるんですね…

5.25 Declaring Attributes of Functions (Using GCC)
ttp://www.crya.unam.mx/computo/manuales/gcc/Function-Attributes.html

読んでみたらコンパイル時のprintfのフォーマットチェックとかも載ってて
ずっと疑問だったけど合わせて解決した。ありがとうございました
433402:2010/02/13(土) 21:39:22
コンパイル時に引数のNULLを警告させる関数を書けたのですが、警告を出した上で
実行時にも変数がNULLか判定させようとすると、判定に失敗してしまいます…
コンパイルオプションで強めの最適化(-O2)をしたときにだけ失敗します。
一体どうなっているんだろう?


ttp://ja.pastebin.ca/1795229

上記のソース(test.c)を
$ gcc -Wall -O2 test.c -o test
とコンパイルして実行すると、my_funcにNULLを渡していても-1を返さずエラーを検知できません。
mainが正常終了してしまいます。

一方、コンパイルする際に最適化オプションを"-O"にすると検知できました。
$ gcc -Wall -O test.c -o test
とコンパイルして実行すると、my_funcにNULLを渡すと-1を返します。
最適化オプションなしでも同じように検知できました。


コンパイルオプションでなぜ挙動が変わるんだろう… "-O2"の何がいけないのだろうか?
実用的には、弱い最適化オプション(-O)でコンパイルすれば済むんですが気になっています。
もう少し詳しい原因が分かる方いらっしゃれば教えて欲しい…

gcc-4.3.2とglibc-2.7を使っています。
434デフォルトの名無しさん:2010/02/13(土) 21:57:30
-O2は-fdelete-null-pointer-checksが入るらしいから
この最適化がattribute((nonnull))を見てNULLチェックを削除したのでは

http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
> The compiler may also choose to make optimizations based on the knowledge
> that certain function arguments will not be null.
とも書いてあるし
435402 (433):2010/02/13(土) 23:10:20
>>434
なるほどそうなのかも…
ありがとう。参考になります。


いろいろ試してみました。
-O2を使っていても、>>433のソースの24行目のfprintfがなければ、
NULLチェックをしてくれたり挙動がまちまち…

というのは、
ttp://ja.pastebin.ca/1795281
このソースなら、

$ gcc -Wall -O2 test.c -o test
t.c: In function 'main':
t.c:10: warning: null argument where non-null required (argument 1)
$ ./test
my_func failed

-O2付きでもちゃんとNULLチェックしてくれる!どゆことー
436デフォルトの名無しさん:2010/02/13(土) 23:39:11
FindFirstFile(path, &fd);
でD:\下のファイルの情報取得を
した後

if(fd.dwFileAttributes==

のあとをどうすれば隠しフォルダが
条件に当てはまりますか?
437デフォルトの名無しさん:2010/02/14(日) 00:03:39
>>435
まぁあれだよ
最適化の効きなんてコンパイラの気分次第
そこまで気にし出すとアセンブラのソース吐かせて見るしか
438デフォルトの名無しさん:2010/02/14(日) 00:11:18
>>436
「隠し」 かつ 「フォルダ」 なら
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
でいけるかと
439デフォルトの名無しさん:2010/02/14(日) 00:12:05
realloc関数を使用したソースコードにsplintをかけているのですが
どうしても警告が消えません。。

そもそもrealloc関数を使用してsplintでの警告は消えないなんてことないのか
と思いはじめてきたので質問します!

どうなんでしょうか先生。。。
440デフォルトの名無しさん:2010/02/14(日) 00:15:56
>>438
D\: のSystem Volume informatonです
441デフォルトの名無しさん:2010/02/14(日) 00:16:16
そのソースコードを晒してもらわないとアドバイスのしようもない
エスパーでもなきゃソースコード見ずに「3行目が間違ってるぞ!」とか指摘できるわけない
442デフォルトの名無しさん:2010/02/14(日) 00:16:20
ああ、そう
で?
443デフォルトの名無しさん:2010/02/14(日) 00:18:32
で?って・・・
で?
444デフォルトの名無しさん:2010/02/14(日) 00:18:45
>>440
名前がわかってるならその名前で判別すりゃいいんじゃねーの
445デフォルトの名無しさん:2010/02/14(日) 00:20:57
442は440に向けて
446デフォルトの名無しさん:2010/02/14(日) 00:25:44
エスパービームを発射した。
447デフォルトの名無しさん:2010/02/14(日) 00:29:43
効果が無かった
448デフォルトの名無しさん:2010/02/14(日) 00:48:27
>>436-444
何とかできました
アドバイスありがとうございます
449デフォルトの名無しさん:2010/02/14(日) 21:34:15
#include <stdio.h>
#include <string.h>
int main(void) //最初に実行される関数
{
char name[17] = "ジッキンゲン";
char rank[] = "男爵";
strcat(name,rank); //変数nameの文字列に変数rankの
            //文字列を合体
puts(name); //変数nameの文字列と改行を出力
return 0;
}

これって何が違うんですか??
450デフォルトの名無しさん:2010/02/14(日) 21:35:27
>>449
何と比べて?
451デフォルトの名無しさん:2010/02/14(日) 21:43:29
>>450
は?というと?
452デフォルトの名無しさん:2010/02/14(日) 21:51:24
辞書より:
 「異なる」は比べてみて同じでないことを表すにとどまるが、「違う」は「約束が違う」「答えが違う」
 「気が違う」など、あるべきこと・状態から外れることをも言う。

どっちの意味だろ。動かない、って意味なのかな。
453デフォルトの名無しさん:2010/02/14(日) 22:12:09
国語の入門編から出直してください
454デフォルトの名無しさん:2010/02/14(日) 22:14:31
>>453
え、どうして?

「これって何が違うんですか?」
→何かが違うから(エラーがでて)動かない

という意味にもとれると思うのですが。
455デフォルトの名無しさん:2010/02/14(日) 22:18:37
>>454
あなたの思考回路が違っているのか
全角空白を問題としているのか
分かりません
456デフォルトの名無しさん:2010/02/14(日) 22:19:14
自分で、「〜意味に”も”とれる」と言ってりゃ世話ねーよ。
やっぱり国語の入門からやり直してこい。

聞く時は、「これって何が間違ってるんですか?」にしとけば良かったな。
457デフォルトの名無しさん:2010/02/14(日) 22:21:46
いや俺は >>450 が「何と比べて」と聞いているから
そういえば「違う」にもいろいろな意味があるよなー、と思って
辞書を引いてみただけだが。

うぜーなマジで。
458デフォルトの名無しさん:2010/02/14(日) 22:23:33
[例文]
自分の想定している動作はコレコレなんですけど、
実行してみると何々と表示されてしまいます。
or
〜というコンパイルエラーが出力されてしまいます。

これは何が間違っているんでしょうか?
459デフォルトの名無しさん:2010/02/14(日) 22:28:38
>>455
思考回路(笑)
460デフォルトの名無しさん:2010/02/14(日) 22:30:44
>>459
失せろゴミ
461デフォルトの名無しさん:2010/02/14(日) 22:31:17

お前もゴミじゃねーの?
462デフォルトの名無しさん:2010/02/14(日) 22:32:55
↑ようゴミ
463デフォルトの名無しさん:2010/02/14(日) 22:33:39
悔しがってるw
464デフォルトの名無しさん:2010/02/14(日) 22:35:11
涙拭けよ
465デフォルトの名無しさん:2010/02/14(日) 22:49:26
ビット演算について質問します。
符号無しの4バイトの型のデータがあったとします。
これは2バイトの上位ワードと下位ワードにわけられます。

今ここで下位ワードを取り出したいとします。
とあるサイトでその方法は↓のようにかかれていました。
low = a & $FFFF;

ここで $ とは何を意味しているのでしょうか? 0xのことかな?と思ったのですが、ぐぐってもでてきません。
FFFFにしているのはビットのマスクをしていることなのだと理解はしています。
が、なぜ2バイトのみにマスクをかけているのでしょうか?理解できません。
普通マスクは0xFと0x0二つがあってはじめて意味をなすと思うのですが?
もし、a & $FFFFだと、aのビットに何か変化はあるのでしょうか?

また、この方法で、aの上位ワード、下位ワードどちらを代入するか指定せずに代入するだけで、
これは4バイトのaの中の上位ワードと下位ワードのうち、2バイトのlowに代入されるときは下位ワードから先に代入されるからなのでしょうか?
回答お願いします。
466デフォルトの名無しさん:2010/02/14(日) 22:55:43
Pascalでは16進数を$FFFFのように書くが、論理積は&とは書かないしな
何の言語だろう
467デフォルトの名無しさん:2010/02/14(日) 23:01:06
補足です。

別に
(4バイトの何らかの型) a;
WORD low, high;
low = a; //下位ワード
high = (a >> 16); //上位ワード;

でいいのでは?と思ったのですが、
なぜ

(4バイトの何らかの型) a;
WORD low, high;
low = a & $FFFF; // ← low = a & 0xFFFF;の誤植??あとANDしても結果は変わらないと思うのになぜマスクしている?
high = (a >> 16) & $FFFF; // ← high = a & 0xFFFF;の誤植??あと、ANDしても結果は変わらないと思うのになぜマスクしている?

にしているのでしょうか?ということです。
468デフォルトの名無しさん:2010/02/14(日) 23:04:41
>>466
ありがとうございます。
では、$は単に0xの誤植っぽいですね。

ところで、なぜマスクしているのでしょうか?
しかも4バイトのデータであるaを2バイトの0xFFFFでマスクしているのですが、
なぜそれが下位ワード2バイト分の場所にわりあてられているのでしょうか?

aをマスクする場合、4バイトであるので、下位ワードだけを残したければ
a & 0xFFFF0000 (リトルエンディアン) だと思うのですが、

もしかして、こういったビットの代入は 左から代入されていくのでしょうか?
そして、入りきらなければ右側は捨てられるのでしょうか?
また、マスクの場合も左から行うということなのでしょうか?
469デフォルトの名無しさん:2010/02/14(日) 23:05:56
間違えました

a & 0xFFFF0000 (リトルエンディアン) 

a & 0x0000FFFF

リトルエンディアン関係ないです
470デフォルトの名無しさん:2010/02/14(日) 23:07:00
検索してわかったけどそれHSPのページじゃないか
HSPって変数に型なんかないんじゃないか
471デフォルトの名無しさん:2010/02/14(日) 23:08:45
0xFFFFの型は何バイトだと思う?
472デフォルトの名無しさん:2010/02/14(日) 23:11:52
>>470
あ、C言語だと思ったら、違う言語だったんですね。すいません。

>>471
2バイトだと思います
473デフォルトの名無しさん:2010/02/14(日) 23:26:46
0xFFFF も 0x0000FFFF も DWORD なら同じだよ。
WORD a = 0x12345678 & 0xFFFF;
DWORD b = 0x12345678 & 0xFFFF;
DWORD c = 0x12345678 & 0xFFFF0000;
WORD d = 0x12345678;
a = 0x5678;
b = 0x00005678;
c = 0x12340000;
d = ??
474デフォルトの名無しさん:2010/02/14(日) 23:34:16
>>472
規格票の6.4.4.1。
読んでみ。
475デフォルトの名無しさん:2010/02/14(日) 23:49:30
>>464
ゴミ(笑)
476デフォルトの名無しさん:2010/02/15(月) 01:05:22
おまいら仲良くしろ!
さもないと、日下部さん召還するぞww
477デフォルトの名無しさん:2010/02/15(月) 01:19:22
>>476
やめてくれ!悪魔より恐ろしい
478デフォルトの名無しさん:2010/02/15(月) 01:26:51
こわがりすぎー
479デフォルトの名無しさん:2010/02/15(月) 02:21:47
>>476
失せろゴミ
480デフォルトの名無しさん:2010/02/15(月) 12:37:03
char str[64] = "\0";
としたとき、str[0]のみ\0になるのですか?
それとも、str[0]〜str[64]全部\0ですか?
481デフォルトの名無しさん:2010/02/15(月) 12:42:34
指定されていない要素は全部0
482デフォルトの名無しさん:2010/02/15(月) 12:45:35
ありがとうございました
483デフォルトの名無しさん:2010/02/15(月) 12:49:24
>481
根拠は
484デフォルトの名無しさん:2010/02/15(月) 12:54:39
>>482
信じるなよw
485デフォルトの名無しさん:2010/02/15(月) 13:01:09
>>483
プログラミング言語C第2版
273ページ
486デフォルトの名無しさん:2010/02/15(月) 13:03:41
構造体の = {0} と同じだよ。
アセンブラで出してみると動作がわかる
487デフォルトの名無しさん:2010/02/15(月) 13:18:34
>>483-484
「不定」とか書いてある根拠なし(有るわけないけど)に根拠要求して速攻返り討ち。
惨め過ぎる。
488デフォルトの名無しさん:2010/02/15(月) 14:25:33
BCC++だと、すべて0だったね
489デフォルトの名無しさん:2010/02/15(月) 15:46:21
char str[] = "abc"; との比較はまた別だが

char str[64] = "abc";
この文と
char str[64] = { 'a', 'b', 'c' };
char str[64] = { 'a', 'b', 'c', '\0' };
こいつらは等価なの?違うの?
490デフォルトの名無しさん:2010/02/15(月) 15:59:51
491デフォルトの名無しさん:2010/02/15(月) 16:07:40
また違う君か.
492デフォルトの名無しさん:2010/02/15(月) 18:08:13
>>485
auto な配列でも 0 に初期化されるんですね。しらなかった。
493デフォルトの名無しさん:2010/02/15(月) 18:23:54
それは無い
494デフォルトの名無しさん:2010/02/15(月) 18:28:08
>>489
残りに0が入るが、残りの数が違うでしょ。
でも結局4番目に0が入るのは変わらない。
495デフォルトの名無しさん:2010/02/15(月) 18:31:56
>>493
いやいや、それが手元の gcc, bcc32, cl, で試すと 0 に初期化されたんですよ。K&R2 の該当ページでは
いまいちよくわからなかったんですが。
496デフォルトの名無しさん:2010/02/15(月) 18:38:27
memset(str, 0, sizeof(str));
するべき
497デフォルトの名無しさん:2010/02/15(月) 18:43:45
しなくていいけどしてもいい
498デフォルトの名無しさん:2010/02/15(月) 20:02:57
数値の切捨てにこれ使うのマズイですかね?

#define Floor(x) (int(x)-1+int((x)-int(x)+1))
499デフォルトの名無しさん:2010/02/15(月) 20:07:24
>>498
標準の関数(math.h) に floor(), ceil() があるのでそちらを。
500デフォルトの名無しさん:2010/02/15(月) 20:08:46
>>496
規格で決まっている以上、余計なことをする必要はないのでは?
あと、double や * のときには、困ったことになりますね。
書いて馬脚をあらわす感じがします。
501デフォルトの名無しさん:2010/02/15(月) 20:12:22
>>499-500
関数呼び出しより速いかなー?と思ったのですが、
やっぱり変なことはしない方がいいですかね。

ありがとうございました。
502デフォルトの名無しさん:2010/02/15(月) 21:27:57
14
503デフォルトの名無しさん:2010/02/15(月) 21:29:54
>>501
ちょっといいすぎたので、軌道修正するとすれば、理解のための試行錯誤に価値がないわけではありません。
504デフォルトの名無しさん:2010/02/15(月) 21:54:18
>>498
#define FLOOR(x) ((int)(x) > (x) ? (int)(x) - 1 : (int)(x))
あたりがわかりやすいかと。
505デフォルトの名無しさん:2010/02/15(月) 22:30:15
>>501
質問してないで試してみろよ。
506デフォルトの名無しさん:2010/02/16(火) 01:19:05
C言語なら俺に質問しないで試せ(入門編)Part 60
507デフォルトの名無しさん:2010/02/16(火) 01:19:58
つーかintにキャストが自動的に切り捨てじゃなかったっけ?
508デフォルトの名無しさん:2010/02/16(火) 01:38:18
質問スレだよな・・・
509デフォルトの名無しさん:2010/02/16(火) 01:39:49
雑談スレ
510デフォルトの名無しさん:2010/02/16(火) 01:42:42
>>507
int(-0.1)=0
floor(-0.1)=-1
511デフォルトの名無しさん:2010/02/16(火) 07:33:04
そもそもintへのキャストが関数呼び出しでない、とは限らないけどね
ただの除算だってCPUやアーキによっては関数コールになるし
512デフォルトの名無しさん:2010/02/16(火) 08:49:54
>>508
自作マクロと標準関数のどっちが早いか
とか、他人に調べさせるなよ。
513デフォルトの名無しさん:2010/02/16(火) 09:20:03
>>494
'c'の後に0が入るが、残りの数が違うでしょ。

残りの数って? 64-3=61 でないの?
514デフォルトの名無しさん:2010/02/16(火) 10:48:23
>>1
上は'a','b','c'と入れて残り61個に0を入れる
下は'a','b','c',0と入れて残り60個に0を入れる
515デフォルトの名無しさん:2010/02/16(火) 14:45:55
      r ‐、
      | ○ |         r‐‐、
     _,;ト - イ、      ∧l☆│∧
    (⌒`    ⌒ヽ   /,、,,ト.-イ/,、 l  つまり同じってことだ!
   │ ヽー―'^ー-' ( ⌒γ⌒~~ /|
   │  〉    |│  |`ー^ー― r' |
   │ /───| |  |/ |  l  ト、 |
   |  irー-、 ー ,} |    /     i
   | /   `X´ ヽ    /   入  |
516デフォルトの名無しさん:2010/02/16(火) 14:57:36
言語以前の質問で悪いけど……
とりあえず初心者は猫でもわかる〜〜で勉強しとけばおk?
517デフォルトの名無しさん:2010/02/16(火) 15:00:35
>>516
オライリーのC実践プログラミング 第3版
518デフォルトの名無しさん:2010/02/16(火) 15:07:14
ロベール
519デフォルトの名無しさん:2010/02/16(火) 20:16:25
>>516
猫も悪くはない
要は何ができそうか、可能性を感じられるきっかけであることで
厳密な正確性は当初後回しでもいい

可能性を感じてから「ふーん」で終わるか「やってやる」とくるかが最初の適性試験
520デフォルトの名無しさん:2010/02/16(火) 20:21:23
コンパイラがない状態の入門はどこでできますか?
参考書などを購入したのがいいですか?
趣味の範囲でプログラミングを始めたいと思ってます。
ちなみに高校生で大学の先取りも兼ねています。
521デフォルトの名無しさん:2010/02/16(火) 20:23:30
>>520
実際に動かしながらでないとなかなか身につかないよ
英語と一緒
522デフォルトの名無しさん:2010/02/16(火) 20:44:25
PCさえあれば、コンパイラなんてどうとでもなると思いますが。
523デフォルトの名無しさん:2010/02/16(火) 21:00:01
>>520
無料のコンパイラは腐るほどあるが・・・
おまえさん、そうではなく特定のコンパイラに毒されることを怖れてるんだろ?

あ・き・ら・め・ろ!
極論すると C という特定の言語に毒されることにも問題がなくはないんだぞ
で、何ができる? 違うだろ、何かするんだよ
what から入れ、how がたまたま C だったら、またおいで
524デフォルトの名無しさん:2010/02/16(火) 21:08:19
javascriptで良いじゃん
525デフォルトの名無しさん:2010/02/16(火) 21:09:06
ここは、(入門編)なんていうスレタイに釣られた初心者を上級者が痛めつるスレであります。
空気が読めない、打たれ強い人間だけが最後まで残ります。
526デフォルトの名無しさん:2010/02/16(火) 21:16:45
そうだったんですね

他あたります
527デフォルトの名無しさん:2010/02/16(火) 21:22:50
スレタイから質問スレだと勘違いされてるが、厳密にはそれは誤解だ
語りたい盛りのCユーザー(入門者)が「俺に聞け」って言ってるだけ
528デフォルトの名無しさん:2010/02/16(火) 21:30:12
>>525
×痛めつる
○痛めつける
529デフォルトの名無しさん:2010/02/16(火) 21:35:51
語りたい盛りのCユーザー(入門者)を上級者が痛めるスレですねw
530デフォルトの名無しさん:2010/02/16(火) 21:39:57
入門程度の知識で間違ったこと語るから痛めつけられるんだよ。
531デフォルトの名無しさん:2010/02/16(火) 22:21:52 BE:1317859564-2BP(110)
#define a b
#define b c
#define c d


a;
b;
c;

って書いたら、どういう風にマクロ展開される?

b;
c;
d;
になる?それとも、
d;
d;
d;
になる?
532デフォルトの名無しさん:2010/02/16(火) 22:31:51
ホントに「〜したらどうなる?」っていうのが多いなw
そんなの1分もあれば試せるだろ
533デフォルトの名無しさん:2010/02/16(火) 22:32:28
>>531
jibundetameseyo
534デフォルトの名無しさん:2010/02/16(火) 22:37:02
>>532-533
「ご自分でお試しになって頂けませんかカス」と言う方が推奨されるらしいぞ。
http://tsushima.2ch.net/test/read.cgi/newsplus/1266160521/
535デフォルトの名無しさん:2010/02/16(火) 22:37:03
プリプロセスだけしてくれるオプションがコンパイラにあるはずなので、
マニュアルを読みましょう
536デフォルトの名無しさん:2010/02/16(火) 22:49:14
hu-n
537デフォルトの名無しさん:2010/02/16(火) 23:05:05
>>520
つ http;//codepad.org
538デフォルトの名無しさん:2010/02/16(火) 23:05:57
ごめん http://codepad.org
539デフォルトの名無しさん:2010/02/16(火) 23:13:16
>>531
gcc なら
gcc -E test.c
などとすれば試せる。ちなみにこのやりかたは google で「gcc プリプロセッサ」というキーワードで検索した。
540デフォルトの名無しさん:2010/02/16(火) 23:25:42
(´・ω・`)
541デフォルトの名無しさん:2010/02/17(水) 00:15:59
>>531
ここで発言している間に確認できるだろ。

よっぽどの馬鹿かわざとだな
542デフォルトの名無しさん:2010/02/17(水) 00:17:42
むかーしむかし。fjに日下部さんという人が居ました。


つづく
543デフォルトの名無しさん:2010/02/17(水) 00:26:33
まだ実在の人物と思ってる奴がいるんですね。
544デフォルトの名無しさん:2010/02/17(水) 00:41:26
>>542
ねぇ、日下部さん、今は2ch?
545デフォルトの名無しさん:2010/02/17(水) 00:55:24
一時期は何人も日下部がいたもんだが。
546日下部陽二:2010/02/17(水) 12:27:17
兄が大変ご迷惑をおかけしました。
よく言い聞かせておきます。
547デフォルトの名無しさん:2010/02/17(水) 12:29:18
mixiで暴れまくってたとこまでは知ってる
548デフォルトの名無しさん:2010/02/17(水) 17:23:38
ファイアウォールがどうかしたんですか
549デフォルトの名無しさん:2010/02/18(木) 16:51:00
日下部さんは良い人だよ。奥さんも美人です。本人はアホの坂田みたいな顔してますが。
550デフォルトの名無しさん:2010/02/18(木) 16:52:27
このスレが「C言語」となっている限りこのスレにはこないでしょう。
彼の世界では、「言語C」だけが存在していて、「C言語」なるもは存在しないのです。
551デフォルトの名無しさん:2010/02/18(木) 16:58:35
深いな
552デフォルトの名無しさん:2010/02/18(木) 17:07:41
糞壁早く死なないかな
553デフォルトの名無しさん:2010/02/18(木) 17:14:57
voidの話しはスレ違い
554デフォルトの名無しさん:2010/02/18(木) 17:16:36
↑void氏ね
555デフォルトの名無しさん:2010/02/18(木) 17:37:40
> 「C言語」なるもは存在しないのです。

まだ言ってたら藁だな
556デフォルトの名無しさん:2010/02/18(木) 19:28:20
日下部みさお
557デフォルトの名無しさん:2010/02/19(金) 00:22:11
ファイアウォールみさお
558デフォルトの名無しさん:2010/02/19(金) 01:53:32
WindowsXP + VisualStdio2008(+付属SDK) です。

#include <windows.h> 
#include <tchar.h> 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){
ULARGE_INTEGER FreeBytesAvailableToCaller;
       FreeBytesAvailableToCaller.QuadPart = 1;
TCHAR tnob[256] = _T("a1");
return 0;
}

なぜかこれをコンパイルすると、
error C2275: 'TCHAR' : illegal use of this type as an expression
というエラーになります。tchar.hをインクルードしているのに、TCHARが使えないなんてありえないと思うのですが。

しかし、
#include <windows.h> 
#include <tchar.h> 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){
ULARGE_INTEGER FreeBytesAvailableToCaller;
TCHAR tnob[256] = _T("a1");
return 0;
}
こうすると、なぜか上記のエラーはなくなります。
いったいなぜなんでしょうか?ULARGE_INTEGERのQuadPartはULONGLONG型であり、普通に1を代入できるはずなのですが。
そもそも、ここがおかしいのと、TCHARが使えないことに関係はないと思うのですが。
解決策わかるかたおられますか?
559デフォルトの名無しさん:2010/02/19(金) 01:57:04
>>558
ファイル名を 〜.c から 〜.cpp に変える。
560デフォルトの名無しさん:2010/02/19(金) 01:59:05
>>599
あれ??エラーなくなりました。ありがとうございます。
しかしなぜなんですか???????
561デフォルトの名無しさん:2010/02/19(金) 01:59:43
>>558
VS2008 はよくわからんが、C99 未対応コンパイラはブロックの先頭でしか
変数宣言できないぞ。
562デフォルトの名無しさん:2010/02/19(金) 02:00:34
VC++2008はC99に対応してないし、VC++2010でも対応しないんじゃなかったっけ
563デフォルトの名無しさん:2010/02/19(金) 08:00:17
error C2275: 'TCHAR' : illegal use of this type as an expression
しかられたヤシ
564デフォルトの名無しさん:2010/02/19(金) 13:07:16
# include <stdio.h>


int main(void)
{
int array[10];
int i;

for(i = 1;i <= 10;i++) { /* for文の始め */

printf("%d 個目の数値を入力してください。:",i); /* 数値の入力部分 */
scanf("%d",&array[i]);
}

for(i = 10;i >= 1;i--) { /* 10個の数値を逆に表示 */
printf("%d\n",array[i]);
}

return 0;
}


http://homepage3.nifty.com/mmgames/c_guide/13-q.html#S7
このURLにある練習問題の[3]
「入力された10個の数値を最後から表示するプログラムを作成せよ。」
という問題を解いてみたのですが、コンパイルするとエラーおきます。
なぜなのでしょうか?
565デフォルトの名無しさん:2010/02/19(金) 13:15:58
int array[11];
配列の要素は要素番号0から始まる。
566デフォルトの名無しさん:2010/02/19(金) 13:27:49
>>565
エラーが出なくなりました。ありがとうございます。
エラーの原因ですが、array[10]としてたせいで、
array[]でできる変数がarray[0]〜array[9]までしかできず、
array[10]を表示しようとしてエラーが起きたと考えていいのでしょうか?
567デフォルトの名無しさん:2010/02/19(金) 17:37:14
array[10]にscanfしたのが原因で '}' で戻れなくなった。
568デフォルトの名無しさん:2010/02/19(金) 18:38:34
今日は、今時scanf使用の練習問題が有ることに驚く日
569デフォルトの名無しさん:2010/02/19(金) 19:25:54
scanfの問題点はともかくとして、最近のC教習本とかでは
scanfは出てこないの?いきなりfgetsとか使ってたりするんか
570デフォルトの名無しさん:2010/02/19(金) 21:11:43
scanfの詳細にこだわる必要性はあんまりないが
scanfを回避するにあたっての困難性をきれいに解決した例をまだ見ない
571デフォルトの名無しさん:2010/02/19(金) 21:31:00
>>568
危険なパターンさえ回避しておればいいのではないかと。
572デフォルトの名無しさん:2010/02/19(金) 23:00:02
fgets()

sscanf()
573デフォルトの名無しさん:2010/02/19(金) 23:15:48
>>572
scanf() で安全な場合もあるのですが。
574デフォルトの名無しさん:2010/02/19(金) 23:18:16
%sはもう教えなくていい
575デフォルトの名無しさん:2010/02/19(金) 23:41:34
>>573
例示以外のレスは無意味
576デフォルトの名無しさん:2010/02/19(金) 23:47:01
cin >>
577デフォルトの名無しさん:2010/02/20(土) 00:30:37
>>571
ほんとうに習い始めの数行くらいのコードでしか使えない。
それ以上のちょっと複雑な処理になると、ほとんどの初心者がはまる。
トラブルの回避方法とかscanf()の細かい挙動なんて学習しても
時間のムダだから、最初から使わないほうがいい。
578デフォルトの名無しさん:2010/02/20(土) 01:40:58
こまけぇこたぁいいんだよ
というAAが思い浮かんだ
579デフォルトの名無しさん:2010/02/20(土) 03:13:01
sscanfでも許さない
580デフォルトの名無しさん:2010/02/20(土) 04:23:16
うん。同意。
581デフォルトの名無しさん:2010/02/20(土) 04:25:29
>>580
ポインタがどこを指しているのか分かりません><
582デフォルトの名無しさん:2010/02/20(土) 13:38:25
>>581
正解です
583デフォルトの名無しさん:2010/02/20(土) 14:43:12
>>581
64bit整数にキャストしてその値をprintfすればどこを指しているか白日の下にさらされるであろう。
584デフォルトの名無しさん:2010/02/20(土) 14:53:16
ポインタで、配列でのアクセスのようにp[1]とするのは、C的にはアウトなのでしょうか?
*(p+1)とすべきなのでしょうか?

int a[10] = { 0 };
int *p = a;

printf("%d", p[1]);
585デフォルトの名無しさん:2010/02/20(土) 14:55:54
>584
いいえ
いいえ
586デフォルトの名無しさん:2010/02/20(土) 21:57:16
>>583
printf("%d", (long long)580);
こうでいい?
587デフォルトの名無しさん:2010/02/20(土) 22:02:21
>>586
%dだとだめだろ。
588デフォルトの名無しさん:2010/02/20(土) 22:17:24
%pってスタンダード?
589デフォルトの名無しさん:2010/02/20(土) 22:21:28
>>588
long longだから、%pでもない。
590デフォルトの名無しさん:2010/02/21(日) 01:52:50
sjisをUTF8のURLエンコードする方法を教えてください
unix環境です 
591デフォルトの名無しさん:2010/02/21(日) 08:53:00
>>590
iconvやnkfを使う
592デフォルトの名無しさん:2010/02/21(日) 11:46:33
>>591

サンクス、うまく行きました、感謝です
でもこれiconvしたあとでURLエンコードもいるんですね
593デフォルトの名無しさん:2010/02/21(日) 12:11:23
ガウスなんたら法とか、わけわかんねー数式じゃなくて

単純な三角形の面積やら
二次方程式の解やら
数列の和やら
美籍やらを求めるアルゴリズムと、解説とサンプルコードを書いた
数値解析入門系のサイトをおしえてくりゃれ
594デフォルトの名無しさん:2010/02/21(日) 12:14:24
ふつーに数学やればいいのでは?
595デフォルトの名無しさん:2010/02/21(日) 12:17:50
>>593
その程度のことは自分で考えろw
596デフォルトの名無しさん:2010/02/21(日) 12:22:09
>>593
中学校いけ
597デフォルトの名無しさん:2010/02/21(日) 13:12:20
C関係ないじゃんw
598デフォルトの名無しさん:2010/02/21(日) 13:14:48
そういう簡単なものを自分でCで書くのが勉強になると思うんだが。
599デフォルトの名無しさん:2010/02/21(日) 16:50:41
思うかもね
600デフォルトの名無しさん:2010/02/21(日) 17:51:22
学問に王道なし
601デフォルトの名無しさん:2010/02/21(日) 18:01:29
>>593
小学校じゃねぇか下手すると
602デフォルトの名無しさん:2010/02/21(日) 18:21:02
char hoge[4]にint hogehogeの数値を代入する方法はありますか?
hoge[0]=hogehoge&0xff000000;
hoge[1]=hogehoge&0x00ff0000;

以外でお願いします。
603デフォルトの名無しさん:2010/02/21(日) 18:27:45
memcpy(hoge, hogehoge, 4);
604デフォルトの名無しさん:2010/02/21(日) 18:29:25
(int)hoge=hogehogeって、できるかも
もしくは、共用体を使う
605デフォルトの名無しさん:2010/02/21(日) 18:35:23
memcpyに3票
606デフォルトの名無しさん:2010/02/21(日) 18:36:02
できるかも、はぁ?
キャストしたのがL-valueになるのか
いつの時代の話だよ
607デフォルトの名無しさん:2010/02/21(日) 18:39:32
リトルエンディアンかビッグエンディアンかの考慮は?
608デフォルトの名無しさん:2010/02/21(日) 18:42:00
>>577
そうですか。scanf("%d", &n) くらいは便利なんですがね。
609デフォルトの名無しさん:2010/02/21(日) 18:42:31
エンディアン考えろよに一票
610デフォルトの名無しさん:2010/02/21(日) 18:44:25
エンディアンはこの場合、あんまり関係無いような
611デフォルトの名無しさん:2010/02/21(日) 18:48:11
ただエンディアンって言ってみたかっただけに一票
612デフォルトの名無しさん:2010/02/21(日) 18:50:54
エンディアン言いたかっただけとちゃうんかい!
613デフォルトの名無しさん:2010/02/21(日) 18:51:10
>>602
共有体を使えば?
614デフォルトの名無しさん:2010/02/21(日) 18:51:18
わざわざバイト毎に保存したいってことはエンディアンに依らないようにしたいんじゃない?
615デフォルトの名無しさん:2010/02/21(日) 18:52:44
> hoge[0]=hogehoge&0xff000000;
> hoge[1]=hogehoge&0x00ff0000;
これを忌避する理由を述べよ。条件後出しは断る。
616デフォルトの名無しさん:2010/02/21(日) 18:54:14
まあ602がエンディアンをまったく知らないとしたら
エンディアンというものがあるということを教えるのは
良いことかも
617デフォルトの名無しさん:2010/02/21(日) 19:12:45
>>593だが
お前らそういうなら
微分・積分のアルゴリズムを書いてみろよ
ほら、はやく。どーせかけないんだろ?
わかってもいねぇ奴が人を腐して偉そうにしてんじゃねぇよ

ほら、書けるもんならかいてみろwwwwwwwwwwカスwww
618デフォルトの名無しさん:2010/02/21(日) 19:24:35
>>617
かわいそう・・・
619デフォルトの名無しさん:2010/02/21(日) 19:26:29
>>617
微分積分のアルゴリズムってなんだよw
620デフォルトの名無しさん:2010/02/21(日) 19:28:34
区分求積法?
621デフォルトの名無しさん:2010/02/21(日) 19:30:14
ゆとりは被害者だよ
622デフォルトの名無しさん:2010/02/21(日) 19:33:09
ネタは他でやってください。
623デフォルトの名無しさん:2010/02/21(日) 19:36:16
>>615
…俺なら、何がどうあってもそれは避けるよ。0固定とかいやだし。
624デフォルトの名無しさん:2010/02/21(日) 19:38:49
>>593が言ってるガウスなんたら法というわけが分からない数式が、ガウスジョルダン法のことなら
もう何も言うまい。それがアルゴリズムそのものだろ…
625デフォルトの名無しさん:2010/02/21(日) 19:41:41
だからよー
美籍なんか、紙で書いたら2乗だのを前にだすだけじゃねぇか

それがなんでガウスなんとか見たいな、わけわかんねーのになるんだよ
求めてるんはそんなんじゃねぇんだよ
シンプルで分かりやすいもんを求めてんだよ

あ?お前らみんなガウスなんとか理解してんのか?おい
626デフォルトの名無しさん:2010/02/21(日) 19:42:49
ライブラリのソース読むのが手っ取り早い。
627デフォルトの名無しさん:2010/02/21(日) 19:45:35
>>625
ねえ、まず学年を教えてくれない?ちょっとあり得ない事言ってるんだけど
628デフォルトの名無しさん:2010/02/21(日) 19:47:10
>>627
うっせーよ
答えも出せないんだろ?お前は。いらねーよカス
629デフォルトの名無しさん:2010/02/21(日) 19:48:25
2乗だのを前にだすだけで三角関数や対数関数も出来るわけ?
微分の定義習ってないの?
630デフォルトの名無しさん:2010/02/21(日) 19:53:05
>>625
>あ?お前らみんなガウスなんとか理解してんのか?おい
自分が世間的にどの程度のレベルなのかを理解することは大事ですよ。
これは数学云々だけの話じゃなくて、たとえば
>単純な三角形の面積やら
底辺と高さから求めるのか、或いは3点の座標から求めるのか、
そういうことすら想定してないでしょう?
631デフォルトの名無しさん:2010/02/21(日) 19:54:09
解析的にとける問題なんか、どうでもいい。
632デフォルトの名無しさん:2010/02/21(日) 19:55:46
>>615
>> hoge[0]=hogehoge&0xff000000;
>> hoge[1]=hogehoge&0x00ff0000;
> これを忌避する理由を述べよ。条件後出しは断る。

オーバーフローするから
633デフォルトの名無しさん:2010/02/21(日) 20:16:50
>>632
何で?
634デフォルトの名無しさん:2010/02/21(日) 20:19:02
シフトしねぇとな
635デフォルトの名無しさん:2010/02/21(日) 20:27:10
unionを知らないとみた
636デフォルトの名無しさん:2010/02/21(日) 20:41:08
ファイルに書き出したいとか通信したいとかってことで
char[4]にしたいなら、memcpy()とかunionじゃないほうがいいよな。
637デフォルトの名無しさん:2010/02/21(日) 20:42:28
意表を突いて、実はこうなんじゃね?
sprintf(hoge, "%d", hogehoge);
638デフォルトの名無しさん:2010/02/21(日) 22:12:16
>>633
>char hoge[4]
が見えんと申すか。
639デフォルトの名無しさん:2010/02/21(日) 22:38:40
>>625
つ mathematica
640デフォルトの名無しさん:2010/02/21(日) 22:39:28
>>631
そうそう、解析に解けない楕円積分とかを数値積分することに計算機の意味がある。
641デフォルトの名無しさん:2010/02/21(日) 22:44:06
>>638
どういうこと?
char c = 1000;ってやるとなんかまずいと思ってる?

あと、unionでどうにかしようと思ってる人は間違いだ
642デフォルトの名無しさん:2010/02/21(日) 22:51:55
C言語って何に特化された言語なんですか?それとも汎用なんですか?
643デフォルトの名無しさん:2010/02/21(日) 22:52:53
UNIXというOSを作るのに特化されていたかもしれない
644デフォルトの名無しさん:2010/02/21(日) 22:55:48
>>641
その心は?
hoge[0] = n & 0xff0000; とかやっても、値が入らないんじゃないかって
ふつーに思うんだけど。
CHAR_MAXが255とは限らないって話?
645デフォルトの名無しさん:2010/02/21(日) 23:05:28
>>641
つまり、union は同時には使わない変数の記憶域節約にのみ使えと?
646デフォルトの名無しさん:2010/02/22(月) 00:05:43
>>644
>>623と同じことをいってるだけかしら

>>645
他の型で取り出せる保証はないからね
647デフォルトの名無しさん:2010/02/22(月) 00:18:48
>>646
機種依存を百も承知のコード(ドライバとかね)を、
そうであることに十分に意識して注意深く記述というのはよくある話で、
アセンブラやニーモニックコードを持たない機械語とのやりとりにあたっては
「保証」はある範囲で存在すればよいことなので一般論にはあてはまらない
648デフォルトの名無しさん:2010/02/22(月) 00:24:01
でっていう
649デフォルトの名無しさん:2010/02/22(月) 00:27:45
>>646
なんだ思わせぶりにひっぱてるだけか。
650デフォルトの名無しさん:2010/02/22(月) 01:13:30
なにいってるかよくわからない
651デフォルトの名無しさん:2010/02/22(月) 09:33:40
リトルエンディアンの時
uint32_t hogehoge;
uint8_t hoge[4];
hoge[0]=hogehoge%256;
hoge[1]=(hogehoge/256)%256;
hoge[2]=(hogehoge/256/256)%256;
hoge[3]=hogehoge/256/256/256;
652デフォルトの名無しさん:2010/02/22(月) 09:43:45
>>467は大層な書き方してるけど
単純に共用体使ってバイトごとのデータをとるのは
よくあるコードだ、てだけじゃないの?

他の分野じゃ知らんが、通信系じゃ普通のことだよ。
653デフォルトの名無しさん:2010/02/22(月) 09:45:26
union
{
uint32_t DWORD;
uint8_t BYTE[4];
} hoge;
uint32_t hogehoge;

hoge.DWORD=hogehoge;
654デフォルトの名無しさん:2010/02/22(月) 10:11:38
>>652の言ってる通り。
>>641もunion使ってるプロトコルスタックを使って、
偉そうにunion使うなと書いている。
655デフォルトの名無しさん:2010/02/22(月) 10:23:26
いつもは規格にうるさい住人もこれに関してはゆるいんだな
処理系でどう定義されてるかを認識した上で使うなら問題ないってこと?
656デフォルトの名無しさん:2010/02/22(月) 10:32:41
unionを使ったことないから
657デフォルトの名無しさん:2010/02/22(月) 10:46:25
これでどう?
冗長?

int n = 1;

if( *(char*)&n ) {
hoge[0] = ((char*)&hogehoge)[3];
hoge[1] = ((char*)&hogehoge)[2];
hoge[2] = ((char*)&hogehoge)[1];
hoge[3] = ((char*)&hogehoge)[0];

} else {
memcpy(hoge, &hogehoge, 4);
}
658デフォルトの名無しさん:2010/02/22(月) 11:40:46
char str[] = "abc\ndef";
とすると
abc
def
となってくれるのですが
smpl.txtに
abc\ndef
と書いて読み込み→表示としても
abc\ndef
となってしまいます
ファイルから読み込んで改行するにはどうすればいいですか?
配列一つでなんとかしたいです
659デフォルトの名無しさん:2010/02/22(月) 11:53:14
660デフォルトの名無しさん:2010/02/22(月) 11:55:04
fscanf とか fgets は1回の読み込みが、改行文字単位での処理区切りになったりする
fread 使ったら?
661デフォルトの名無しさん:2010/02/22(月) 11:56:23
あー "\n" という文字列を 改行コードに置換する話だったのか…
662デフォルトの名無しさん:2010/02/22(月) 12:02:01
ありがとうございました
うまくいきました
663デフォルトの名無しさん:2010/02/22(月) 12:06:17
うまくいきましたから、今日はカレーを食べますね
664デフォルトの名無しさん:2010/02/22(月) 14:29:02
>>655
甘いっつか、intの値をcharの配列に入れる時点で
処理系に依存せざるを得ないからなぁ・・・
665デフォルトの名無しさん:2010/02/22(月) 14:33:01
>>664
エンディアンさえ正しく認識してれば問題ないと
666デフォルトの名無しさん:2010/02/22(月) 15:07:24
>>658
#include <stdio.h>
#include <stdlib.h>
int main(void){
return printf(fgets(malloc(256),256,fopen("sample.txt","r")));
}
667デフォルトの名無しさん:2010/02/22(月) 15:11:26
>>666
echo 100%dry-fruits > sample.txt
668デフォルトの名無しさん:2010/02/22(月) 15:22:08
>>666
\nを改行だと解釈するのはprintfじゃないよ。cコンパイラ。
669デフォルトの名無しさん:2010/02/22(月) 17:40:29
えぇー
670デフォルトの名無しさん:2010/02/22(月) 17:43:33
文字列中の単独の¥(未定義のエスケープキャラ)
はどのような扱いを受ける?無視?それともエラー?
警告?
671デフォルトの名無しさん:2010/02/22(月) 17:44:04
くっはーw
672デフォルトの名無しさん:2010/02/22(月) 18:03:19
文字列中の単独の\
は、実行中はただの\
673デフォルトの名無しさん:2010/02/22(月) 18:05:59
>>670
文字列と文字列リテラルの区別がつくようになれよ
674デフォルトの名無しさん:2010/02/22(月) 18:23:48
実行中に警告を出してくれるライブラリは少ない
単独の¥を¥として扱ってくれるコンパイラも少ない
¥¥としないと¥としては扱ってくれない
675デフォルトの名無しさん:2010/02/22(月) 18:29:59
はあ?
676デフォルトの名無しさん:2010/02/22(月) 18:33:44
文字コードを正しく使えない奴が語るな。
677デフォルトの名無しさん:2010/02/22(月) 18:36:29
だから
 プログラム記述中に登場する \ と(リテラル)、
 メモリ上でのイメージでの \ (0x5c)
を区別しろって。

dll なんかのバイナリコード中の 0x5c を変換されたらカワナン
678デフォルトの名無しさん:2010/02/22(月) 18:37:04
まあ初心者にありがちな勘違いではある。
このスレ向きかもな
679デフォルトの名無しさん:2010/02/22(月) 18:50:47
いつも\と¥が化けるのが気になる。
680デフォルトの名無しさん:2010/02/22(月) 18:53:55
MSDNのprintfのページだとprintfの機能だと思ってしまってもしかたないかもw
http://msdn.microsoft.com/ja-jp/library/wc7014hz(VS.80).aspx
681デフォルトの名無しさん:2010/02/22(月) 19:16:41
コンパイラはソースコード上の文字列
"abc¥¥cde"
を見るとこれは"で始まっている"で終わっているから
文字列リテラルと呼んでる奴だな
と判断し文字列リテラル中の連続する¥¥は
単独の¥であるがごとく解釈する
連続しない¥が現れた場合¥nなどのように
後ろの文字によっては別の文字に置き換えて
解釈する場合もあるが殆どの場合は警告を出して
スキップする。
"表¥計算"とかが警告だされるどころかそれまで
出ていた警告が逆に消える理由は表という
テキストエディターでは漢字に見える文字列は
コンパイラは実は2つ(以上の)の文字列でしか
なく偶々その後ろの文字が¥に一致していたから
682デフォルトの名無しさん:2010/02/22(月) 19:19:12
×>コンパイラは実は2...
○コンパイラにとっては実は2...
683デフォルトの名無しさん:2010/02/22(月) 19:41:58
\じゃなくて¥と書かれているあたりがなんかやらしい。
684デフォルトの名無しさん:2010/02/22(月) 19:42:45
それMac版の\?
685デフォルトの名無しさん:2010/02/22(月) 19:49:03
>>683
バックスラッシュを円記号に変換する2ちゃんねるブラウザ()が
あるらしいですよ?
686デフォルトの名無しさん:2010/02/22(月) 19:50:29
>>685
あ、そなの?それは失礼しました
687デフォルトの名無しさん:2010/02/22(月) 20:43:17
俺のブラウザでは・(中点)に見える。
688デフォルトの名無しさん:2010/02/22(月) 21:26:12
>>686
失礼と言う程でもないですよ
689デフォルトの名無しさん:2010/02/22(月) 23:50:12
Cでパスとか何回か記述しているときなんかは
perlの''とかC#の@""とかが恋しく思うときがある
690デフォルトの名無しさん:2010/02/23(火) 00:37:30
パスなら/で通るようにできてるだろ。
MSでも
691デフォルトの名無しさん:2010/02/23(火) 01:25:19
普段は、windows でも / をセパレータとして使ってるなあ
\\ は見づらいし
692デフォルトの名無しさん:2010/02/23(火) 03:54:32
ほぼ初心者の状態から
・メモ帳から200個の数字を読み取ってその平均値を出して、またメモ帳に書き込む
というプログラムを作れるようになるにはだいたい何日くらいかかりますかね?
693デフォルトの名無しさん:2010/02/23(火) 04:03:00
2日
694デフォルトの名無しさん:2010/02/23(火) 04:24:17
>>692
リアルメモ帳上の20個の3桁の整数値の平均を出せるように
なるまで個人差、環境差、状況差もあるが産まれてから10年
程度じゃまずムリと考えたほうが良さげ
200個10桁ともなれば30年経っても無償でやれる人は
殆ど居ない
200個100桁ともなると例え有償でも手計算でノーミスで
やれる人自体皆無になる。
(Windowsアプリ「メモ帳」のメモリ内容を書き換えるなんて
操作取得までの時間なんてきかないほうがよい)
C言語でテキストファイルから200個の数字を読み取り平均値を
付け加える処理の記述が自然にラクに出来るようになるまでの
時間もきかないほうがいいが,Windows環境というのであればWSH
処理系を選んだほうがやや速いのではないかと
695デフォルトの名無しさん:2010/02/23(火) 10:54:18
Window列挙して、「メモ帳かどうか」、「タイトルは何か」、で窓を特定して
Ctrl+Aなげて全選択してCtrl+C投げてコピって
数字だけ拾い出して平均値出して、それをまたメモ帳にSetWindowTextすればいいんでね
以上のことを調査で1日作業で1日予備で1日で3日

>>694

なにこれ?
手計算ってなに?手計算でやるプログラムってどう誤読するとそうなるんw
生まれてからって何? 692の言っているのは初心者からであって、誕生からではなくね?
696デフォルトの名無しさん:2010/02/23(火) 11:18:49
ボケに対する突っ込みはもっとスマートにやっていただきたい。
697デフォルトの名無しさん:2010/02/23(火) 11:48:45
初心者から3日でできるわけが
698デフォルトの名無しさん:2010/02/23(火) 14:03:14
3日もかけるの?
699デフォルトの名無しさん:2010/02/23(火) 14:17:24
一日どのくらい勉強するかによるけど、3日あればそのくらいのプログラムは
作れるようになるんじゃね
700デフォルトの名無しさん:2010/02/23(火) 14:34:51
それをやるために必要なことだけを学習すれば早いだろうけど、
基礎から順番に習っていってそれができるまでに要する期間となると、結構かかるかもね
701デフォルトの名無しさん:2010/02/23(火) 14:56:40
できるって言ってる人とできないって言ってる人の
想像する「初心者」がまったく違うと思われ
702デフォルトの名無しさん:2010/02/23(火) 17:06:40
言語は初心者 + OS周辺も初心者
言語はできる  + OS周辺は初心者
言語は初心者 + OS周辺は経験あり
703デフォルトの名無しさん:2010/02/23(火) 17:09:36
土日潰せば出来るよ
704デフォルトの名無しさん:2010/02/23(火) 17:24:36
初心者じゃなくておまえらならどんだけかかるんだよ。
705デフォルトの名無しさん:2010/02/23(火) 17:35:40
メモ帳のプラグイン?
706デフォルトの名無しさん:2010/02/23(火) 19:59:14
まったく、エラー処理もしていないし
メモ帳にカンマ区切りで数字のみ並んでいてかつ、メモ帳が1個しか起動してないなら
そしてメモ帳に書いてある事は消えるけど

つか保存して読み込んだほうがよくね? そうすればよくある初心者むきのプログラムだし

int i=0;
int count=1;
HWND np,npe;

np=FindWindow("Notepad",NULL);
npe=FindWindowEx(np,0,"Edit",NULL);

SendMessage(npe, WM_GETTEXT, sizeof(str), (LPARAM)str);
p = strtok(str,",");
i += atoi(p);
while(p = strtok( NULL,",")){
i += atoi(p);count++;
}
i /=count;
sprintf(str,"%d",i);
SendMessage(npe, WM_SETTEXT, 0, (LPARAM)str);
707デフォルトの名無しさん:2010/02/24(水) 00:07:47
>>692はメモ帳で作ったテキストファイルの読み書きをしたいだけの気がするのは、私だけ?
708707:2010/02/24(水) 00:10:34
正確には、メモ帳で作成して"保存済み"のテキストファイルの読み書きかな。

709デフォルトの名無しさん:2010/02/24(水) 00:18:56
その質問に関しても答えがまだ出てないだろ
何せCの文法やライブラリすら完全に固まっ
てるというわけでもないんだからよ
710デフォルトの名無しさん:2010/02/24(水) 00:35:10
Cの文法やライブラリが固まってなければみんな困るだろw
>>692のやりたいことが固まってないだけだw
711デフォルトの名無しさん:2010/02/24(水) 02:01:46
中央値を求めるにはソートしてから真ん中の要素を取るしかないでしょうか?
それ以外に方法はありますか?
お願いします。
712デフォルトの名無しさん:2010/02/24(水) 02:06:03
ソート以外にも方法はあるけど、一番分かりやすくて単純なのはその手法だと思う
まぁ「中央値 アルゴリズム」でぐぐれば山ほど説明がでてくる気に入ったの試してみたら
713デフォルトの名無しさん:2010/02/24(水) 02:07:12
>>711
http://pc12.2ch.net/test/read.cgi/tech/1266844916/18
タイミングよくこんな話がでてるよ
714デフォルトの名無しさん:2010/02/24(水) 02:10:04
こういうのはアーキテクチャーやデータ構造、そして状況依存な
話ですので、一般論は差し控えたいものですなw
コンテクストを教えて頂かなければ答えられません。
715デフォルトの名無しさん:2010/02/24(水) 02:11:16
データの並び替えすら禁止されている状況もありますね
716デフォルトの名無しさん:2010/02/24(水) 02:17:54
本物を並べ替えなければばれないよ
717デフォルトの名無しさん:2010/02/24(水) 02:37:49
>>708

SendMessageでファイル保存ダイアログ開かせて適当なファイル名をWM_CHARで送ってボタンのハンドルにlbtndown送って保存させて、
それを開いて読み込んでって感じに706を改良すれば委員じゃね?
718デフォルトの名無しさん:2010/02/24(水) 02:52:11
本物に対してポインタが定義されていても、一時的である
ケースもありまつ(次のアクセスまで有効かつ次のアクセス時
に必須)(列挙において常に順序が変わります)
そして本物のデータの一個一個がかなり巨大なので
全部を配列にコピーして記憶も無理です
719デフォルトの名無しさん:2010/02/24(水) 07:50:40
>>712
ありがとう。いろいろ調べてみます。が、難しそうですね。
720デフォルトの名無しさん:2010/02/24(水) 15:42:22
>>719
うん、難しいよ
721デフォルトの名無しさん:2010/02/24(水) 15:47:14
いいえ。多くの場合は整列して中間の値を取る
だけでよくてつまり簡単のではないかと ....
>>715のようなひねくれたケースに限っては
中間値を求めること自体に意味があるケース
は殆ど無いのではないかと思われます。
722デフォルトの名無しさん:2010/02/24(水) 21:15:45
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10550.txt
VC++で書いたんですが、文字数が合う時と合わない時があります
最初は必ず1,0になるみたいです
どこがいけないのでしょうか
723デフォルトの名無しさん:2010/02/24(水) 21:41:52
>722
他は見てないけど
96行目が怪しい
if(position[0] = '\0'){
724707:2010/02/24(水) 21:43:39
>>717
もっとC言語の入門的な既に保存済みのhoge.txtをfopenで開いて処理したいだけと想定しました。
>>692が答えてくれないと正解は分かりませんけど。
725デフォルトの名無しさん:2010/02/24(水) 22:00:22
>>723
位置も種類も当たった文字数が0の時、種類のみ当たった文字数を
カウントする部分なんですが、試しに消したら余計におかしくなりました・・・
726デフォルトの名無しさん:2010/02/24(水) 22:51:13
>>724
つまり>>692はPCの初心者も兼ねるよ派ですね
727デフォルトの名無しさん:2010/02/24(水) 22:58:25
>>725
=って何?==のこと?
728デフォルトの名無しさん:2010/02/24(水) 23:13:10
>>727
あ、すみません「==」の間違いでした
直しましたがやっぱり文字数が合わない時があります
729デフォルトの名無しさん:2010/02/24(水) 23:37:48
>conjecture[i] = buf[i] - 1;

この-1ってなんですか?
730デフォルトの名無しさん:2010/02/24(水) 23:59:06
>>729
最初文字列の読み込みの仕方がよくわからなかったので、とりあえず大学のプリントを
真似しようと思って読み込み部分はコピペしてます

元はfgetsで読んだ文字列に対して、各文字コードが1小さい文字列を配列に作るプログラム
(の一部)みたいです
-1消しても変わりませんね・・・
>>722は大学の課題です
731デフォルトの名無しさん:2010/02/25(木) 01:46:19
たぶん bufとかsecretを初期化して無いからとかじゃね

一回ごとにmemsetで0詰めるとかすればいいと思う


732デフォルトの名無しさん:2010/02/25(木) 01:53:36
char secret[BUFLEN],secret2[BUFLEN], conjecture[BUFLEN];
int i,f,len,n,n1,n2;
memset(secret,'\0',sizeof(secret)); memset(secret2,'\0',sizeof(secret2));
printf("秘密の単語は? ");
fgets(secret2, BUFLEN, stdin);
secret2[strlen(secret2)-1]='\0';
len = strlen(secret2);
printf("秘密の単語は %d 文字です。\n", len); n=0;
while(1){
strcpy(secret,secret2);//secretはいじるのでおおもとかっらコピって使う
printf("類推した単語は? ");
memset(conjecture,'\0',sizeof(conjecture));
fgets(conjecture, BUFLEN, stdin);
conjecture[strlen(conjecture)-1]='\0';
if(!strcmp(conjecture,secret))break;
n1 = 0; n2 = 0;
for(i=0;i<len;i++){ //位置も値も同じ
if(secret[i]==conjecture[i]){
n1++; secret[i]=conjecture[i]=NULL;//カウントアップして見つけた所つぶす
}
}
 for(i=0;i<len;i++){ //位置違い
for(f=0;f<len;f++){
if(secret[i] && conjecture[f]){//つぶしたところはやらない
if(secret[i]==conjecture[f]){
n2++; secret[i]=conjecture[f]=NULL;//カウントアップして見つけた所つぶす
}}}}
printf("位置も種類も当たった文字数は %d 、種類のみ当たった文字数は %d です。\n",n1 ,n2); n++;
}
printf("%d 回で当てました!\n", n);return 0;
}
733デフォルトの名無しさん:2010/02/25(木) 01:56:03
>>722です
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10551.txt
このように書き換えたらちゃんと動きました
positionとkindの初期化位置、NULL文字を入れる位置などがおかしかったっぽいです(多分
ご回答くださった方々どうもありがとうございました
734デフォルトの名無しさん:2010/02/25(木) 02:02:59
あ、positionとkindの0番目にNULL入れる位置2つあるし、片方消しても動くなぁ
とりあえず完成したからよしとしよう・・・
735デフォルトの名無しさん:2010/02/25(木) 14:14:06
ソートプログラム選択法が 上手く動きません。

do
{
flag=0;
for(j=i+1;j<9;j++);
{
if(msort[i]>msort[j])
{
work=msort[j];
msort[j]=msort[i];
msort[i]=work;
flag=1;
}
}
for(k=0;k<10;k++)
{
printf("%4d", msort[k]);
}
printf(" \n ");
i++;
}while(flag==1);

下方のprintf関数はスルーでおk
配列に入ってる10個の数値から、最小値を見つけて見つけたら入れ替えを
繰り返して昇順にソートするプログラムです。
何かおかしいところあったら教えてください。
736デフォルトの名無しさん:2010/02/25(木) 14:18:32
>>735
つスレタイ
737デフォルトの名無しさん:2010/02/25(木) 15:10:34
少し前まで正常に動いていたプログラムがmallocのところで
セグメンテーションフォールトで落ちるようになってしまいました。
確保しようとするサイズも16バイトと小さいです。
どのような原因が考えられるでしょうか?

(gdb) bt
#0 0x00002b186539ad03 in mallopt () from /lib/libc.so.6
#1 0x00002b1865399ff7 in malloc () from /lib/libc.so.6
738デフォルトの名無しさん:2010/02/25(木) 15:33:33
少し前まではまぐれで動いていた。
739デフォルトの名無しさん:2010/02/25(木) 15:36:08
なるほどわかりました。解決しました。ありがとうございました。
740デフォルトの名無しさん:2010/02/25(木) 20:58:37
>>735
do〜whileをやめて
for ( int i = 0; i < size; i++ )
{
for ( int j = i + 1; j < size; j++ )
{
並び替え
}
}

じゃダメかしら
741デフォルトの名無しさん:2010/02/26(金) 03:33:03
>>735
>for(j=i+1;j<9;j++);

あと、入れ替えが起きなかった場合に途中でソートが終了してしまう。
742デフォルトの名無しさん:2010/02/26(金) 11:07:42
>>740
do〜whileは flag立てる為に使いたい

>>741
>for(j=i+1;j<9;j++);
for文にセミコロン入ってるwww
初歩的ミスでした。。。
セミコロン消して実行したら、問題解決しました!

>>740>>750
ありがとう!
743デフォルトの名無しさん:2010/02/26(金) 11:18:17
そのフラグを立てるってやり方がおかしい。
たとえば先頭にたまたま一番小さい値が入ってた場合、
ソートは全くなされない。
744デフォルトの名無しさん:2010/02/26(金) 12:42:06
あぁ、ここには書いてないが、一部をもってきた。

フラグを立てて整列されたかを判断。
そのたびに、一回目、二回目・・・と出力するプログラムを作ってました。
745デフォルトの名無しさん:2010/02/26(金) 12:45:22
>>732-734
http://www.kouno.jp/home/c_faq/c5.html#9
> ... 特にASCIIのナル文字(NUL)が必要な場合は、絶対にNULLを使っ てはならない。 ...
746デフォルトの名無しさん:2010/02/26(金) 12:50:19
河野氏はオーバーな表現でウケを狙う傾向が強いから
額面どおり読んじゃだめだよ
747デフォルトの名無しさん:2010/02/26(金) 12:56:32
>>732-734
http://www.c-faq.com/null/nullor0.html
> ... In particular, do not use NULL when the ASCII null character (NUL) is desired. ...
748デフォルトの名無しさん:2010/02/26(金) 12:58:32
なるほど。 "do not use" が "must never use" になってるな。
749デフォルトの名無しさん:2010/02/26(金) 13:00:02
>>746,748
だから何? char x = NULL とかしていいとでも言うの?
750デフォルトの名無しさん:2010/02/26(金) 13:03:38
いいよ
751デフォルトの名無しさん:2010/02/26(金) 13:11:42
Nがすごく大きいとき、(1<<14とか)
mainの外で
double a[N][N];
とすると、(時間はかかるけど)領域確保できるのですが、、
mainの内で同じ式を書くと
Segmentation fault
になってしまいます。

なぜですか?
752デフォルトの名無しさん:2010/02/26(金) 13:13:30
表現はオーバーかもしれないが、ダメなものはダメ。
753デフォルトの名無しさん:2010/02/26(金) 13:19:23
予想される解答
「グローバル変数にした場合、プロセスファイルに
その情報が書き込まれ、領域確保はシステム状態
を熟知しているOSがより洗練された方法でプロセス
実行前に行い失敗する限りプロセスを開始しないから
失敗しようがない。
ローカル変数にした場合能力が本質的に低く
単純だが速度が速い方法でプロセス自体が領域を
確保を行うから失敗する。」
↑これ古い考え方だから多分不正解
754デフォルトの名無しさん:2010/02/26(金) 13:23:47
>>751
環境によるけど、たぶんスタックが足りないから。
755デフォルトの名無しさん:2010/02/26(金) 13:30:02
なるほど。
たしかにmainの内でも、
static double a[N][N];
にしたら確保できました。
ありがとうございました。
756デフォルトの名無しさん:2010/02/26(金) 15:04:43
>>750
バカだなあ、と思われても構わないならいいけど。
757デフォルトの名無しさん:2010/02/26(金) 15:49:13
>>756
どういう点でばかだなぁと思われると思っているかによって評価が変わるレスだな
758デフォルトの名無しさん:2010/02/26(金) 17:38:39
質問なのですが、定数NULLの型って、何でしょう?
手元のコンパイラ(bcc)ですと、以下のようになっているのですが、C++とCでは
NULLの型が違うということ?

# if defined(__cplusplus) || defined(_Windows)
# define NULL 0
# else
# define NULL ((void *)0)
# endif
759デフォルトの名無しさん:2010/02/26(金) 18:02:27
c++では
void *と他のポインタはコンパチではないので、比較、代入できない。
関数プロトタイプは省略出来ない。
従って0を使う。
Cでは
void *は他のポインタとコンパチ、比較、代入できる。
関数プロトタイプはオプション
従って(void *)0を使う。
760デフォルトの名無しさん:2010/02/26(金) 18:13:13
>>759
情報どうもです。少し難しくて微妙に理解できないので、もう少し
勉強してからまた来ます><;

C++は型チェックが厳密と聞いていたのですが、ポインタにスカラー値を
直接代入できるとか、曖昧な点もあるのですね。メモメモ・・・
761デフォルトの名無しさん:2010/02/26(金) 18:15:28
>>759
関数プロトタイプと 0 の関係についてぜひ教えてください。
762デフォルトの名無しさん:2010/02/26(金) 18:17:19
定数0だけ特別。
定数0と等しいポインタはどこも指していない(ヌルポインタ)。
定数0が代入されたポインタはどこも指していない(ヌルポインタ)。
763デフォルトの名無しさん:2010/02/26(金) 18:17:36
>>760
つ http://www.kouno.jp/home/c_faq/c5.html#0
すなわち、char *p = NULL; ではポインタにスカラを代入するわけではない。
764デフォルトの名無しさん:2010/02/26(金) 18:20:12
関数プロトタイプが無いと、引数に0が与えられるとデフォルトでintと解釈される。
sizeof(int) != sizeof(void *)の時に破綻する。
765デフォルトの名無しさん:2010/02/26(金) 18:29:50
>>762
ヌルポインタの実装上の表現が 0 と同一とは限らない点に注意。
766デフォルトの名無しさん:2010/02/26(金) 18:43:06
ヌルポな話はこちらでもどうぞ
new/deleteで異常終了する(Visual C++)
http://pc12.2ch.net/test/read.cgi/tech/1262777752/
767デフォルトの名無しさん:2010/02/26(金) 19:01:35
>>766
もう話終わってるよ
768デフォルトの名無しさん:2010/02/26(金) 19:22:29
>>765
オレにアンカー張るな。
769デフォルトの名無しさん:2010/02/26(金) 21:20:38
どこで聞くべきか迷ったのでここで聞きます。

モジュール分けしてファイルを分けた時に、
例えば main.c calc.c output.cと分けたとして、
calc.cでしか使わない構造体とかの定義ってcalc.hに書きますか?
それともcalc.cの先頭につらつらと書きますか?
770デフォルトの名無しさん:2010/02/26(金) 21:28:49
>>769
ヘッダファイルにするのは、記述内容を複数のコンパイル単位で読み込むため、と限定して考えるのであれば、
> それともcalc.cの先頭につらつらと書きますか?
の方を私はとります。
771デフォルトの名無しさん:2010/02/26(金) 21:34:44
int Count = 0;
if (count ==100){
Printf ("売り切れ\n");
}
else{
count ++;
}

本から抜粋なんだけど何を基準に
int Count;とint Count=0;を使い分けてるの?
772デフォルトの名無しさん:2010/02/26(金) 21:45:10
その本を今すぐ投げ捨てるんだ。
773デフォルトの名無しさん:2010/02/26(金) 21:57:45
正直破り捨てたいけど図書館から借りた本だからな…
プログラミングの本なのにカレーの作り方とか載ってるからね…
774デフォルトの名無しさん:2010/02/26(金) 23:01:39
>>759
C++ でも void* との比較はできる。

(void*)0 は C では特別ルールで 0 と同様にヌルポインタ定数として働くが、
C++ にはこの特別ルールは無いというだけ。 void* から他のポインタに
暗黙変換が効くこととは直接関係ない。また、 C で NULL が 0 と定義されて
いてもなんら問題は無い。
775デフォルトの名無しさん:2010/02/26(金) 23:08:28
>>774
null pointerの内部表現が0ではない、かつ、intに収まる環境だったとして
char *p = 0;
int int_p = p;
とした場合、
int_p == 0 は偽になり、int_p == (void *)0 は真になるのではないかと思ったがいかがか
776デフォルトの名無しさん:2010/02/26(金) 23:25:24
>>775
ポインタ型から整数型に変換した場合の結果について、標準ではほとんど
何も定められていない。定められているのは、 void* から (u)intptr_t に変換して
それをさらに void* に変換した場合は元の値に戻る、ということだけ。

従って2つの比較の結果について標準の範囲で言えることは何も無い。同じく
標準の範囲ではそれらの比較結果にヌルポインタの内部表現は関係ない。

まぁわざわざこれらの変換の際にビットパターンをいじらなければ標準で
定められた動作は達成できるんで、たいていの環境では思ったとおりの結果に
なっちゃうだろうね。
777デフォルトの名無しさん:2010/02/27(土) 00:00:35
まぁ>>759で大体あってるよ。
intとポインタで内部表現やビット幅が違う場合とかで、
NULLの定義が0だと問題になることがあるんだ。

>>774で言うような特別ルールは無かったと思うよ。
778デフォルトの名無しさん:2010/02/27(土) 00:06:05
身近なところでは、8086のnull pointerは0じゃない場合がある。
779デフォルトの名無しさん:2010/02/27(土) 00:14:02
NULL != 0
だが
0==NULL
じゃなかったかな
780デフォルトの名無しさん:2010/02/27(土) 00:16:28
>>777
> NULLの定義が0だと問題になることがあるんだ。

ねーよ。

> >>774で言うような特別ルールは無かったと思うよ。

あるんだってば。

ISO C 6.3.2.3 p3 より。
> An integer constant expression with the value 0, or such an expression
> cast to type void *, is called a null pointer constant.
C++ には "or such an expression cast to type void *" のような部分が無い。
781デフォルトの名無しさん:2010/02/27(土) 00:17:36
>>778-779
とりあえず黙って C FAQ 読んでくれ。
http://www.kouno.jp/home/c_faq/c5.html
782デフォルトの名無しさん:2010/02/27(土) 00:31:58
>>781
8086の場合は、特殊だからね。
783デフォルトの名無しさん:2010/02/27(土) 00:43:42
8086だけが特殊なの?
784デフォルトの名無しさん:2010/02/27(土) 00:44:56
>>782
わざわざ内部表現に依存するようなコードを書かなければ特殊でもなんでもない。
内部表現に依存するようなコードはすべて未定義や実装依存や不定な動作になるんで、
基本的に書くべきではない。

せっかく C 使ってるのにそんな環境ベッタリなコードが必要になることなんてあるの?
785デフォルトの名無しさん:2010/02/27(土) 00:48:10
ANSI Cからは外れてるので、忘れてくれ。
786デフォルトの名無しさん:2010/02/27(土) 00:51:54
何を忘れろって?誰だよおまえ。
787デフォルトの名無しさん:2010/02/27(土) 00:57:03
>>784
> せっかく C 使ってるのにそんな環境ベッタリなコードが必要になることなんてあるの?
Cで書く時は、環境べったりなコードだらけのことが多いだろ。
788デフォルトの名無しさん:2010/02/27(土) 00:57:42
LSI C すら ANSI 準拠だというのに、「身近なところでは」とか言いながら
どんだけ昔の話をしてたんだ?
789デフォルトの名無しさん:2010/02/27(土) 00:59:29
>>787
で、どんな時にヌルポインタの内部表現に依存するようなコードが必要になるの?
790デフォルトの名無しさん:2010/02/27(土) 01:02:47
near pointer と far pointerを混ぜて使うといろいろ不思議なことが起こる。
32bitのWindowsなら、8086で書いたプログラムも動くだろ。
791デフォルトの名無しさん:2010/02/27(土) 01:11:45
LSI CはANSI 準拠では無いと明言してなかったっけ?
792デフォルトの名無しさん:2010/02/27(土) 01:12:25
>>789
メモリのオフセット0にアクセスするとき。

組み込みです・・・
組み込みです・・・・・・

まぁ本題には関係ない気もする。
793デフォルトの名無しさん:2010/02/27(土) 01:16:15
>>791
http://www.lsi-j.co.jp/product/c86/
> ■ ANSI標準規格に準拠したコンパイラ

もしかしたら古いバージョンでは規格に準拠していなかったのかもしれないけど。
794デフォルトの名無しさん:2010/02/27(土) 01:21:45
試食版の4.1.1 言語仕様にはANSIとの相違点が列挙されてるな
どこまで仕様にそってればANSIと名乗れるんだろうか
795デフォルトの名無しさん:2010/02/27(土) 01:22:23
>>793
8086だと、ANSI Cに準拠したコンパイラでも、ANSI C準拠のオプションをつけてコンパイルすることはあまりないよ。
796デフォルトの名無しさん:2010/02/27(土) 05:10:31
>>795
試食版には「ANSI C準拠のオプション」とかいうやつは見当たらなかったんだけど、
製品版にしか無いものなの?
797デフォルトの名無しさん:2010/02/27(土) 07:22:26
>>774
一行目はその通り。
Cで#define NULL 0ではダメな理由は解説済み。
>>764に反論しろ。

>>759は↓このように訂正
------------------------------------------------------
c++では
void *と他のポインタはコンパチではないので代入できない。
関数プロトタイプは省略出来ない。
従って0を使う。
Cでは
void *は他のポインタとコンパチなので代入できる。
関数プロトタイプはオプション
従って(void *)0を使う。
------------------------------------------------------
798デフォルトの名無しさん:2010/02/27(土) 08:28:55
>>796
8086のCコンパイラはnearとfarが予約語になっている。LSI-Cはあったか定かでないが、Turbo Cにはこういう拡張を使わないオプションがある。8086でそれなりの大きさのプログラムを作るときは、これを使わないというわけにはいかない。
799デフォルトの名無しさん:2010/02/27(土) 09:00:34
>>797
それだと、Cでは(void *)0を使うべきって見えてしまう。
CもC++もNULLポインタは 0でいい

特殊な場合にプログラマがポインタであることをキャストで
示さないといけないけど、あくまでそういう場合もあるってだけ
800デフォルトの名無しさん:2010/02/27(土) 09:12:45
>>799
> それだと、Cでは(void *)0を使うべきって見えてしまう。
そう言っている。それで不都合は無い。
一方そうしなかった場合の不都合は既に述べた。
801デフォルトの名無しさん:2010/02/27(土) 10:00:48
個人の主義の主張は別に構わないけど、あれだと一般論のように見える
802デフォルトの名無しさん:2010/02/27(土) 10:06:28
一般論だから標準インクルードファイルで
#define NULL ((void *)0)
されている。
803デフォルトの名無しさん:2010/02/27(土) 11:11:59
http://www.kouno.jp/home/c_faq/c5.html
見ると、#define NULL ((void *)0) は「ポインターの内部表現がどんなデータ型
でも同じマシンに限られる」って制限が付いてるから。ポインタの内部表現が
データ型によって異なる環境が存在することを考えると、広義(一般論)としては
((void *)0) より 0の方が適当な気がするが、チガウ?
804デフォルトの名無しさん:2010/02/27(土) 11:13:11
NULLを使えばいいだろw
805デフォルトの名無しさん:2010/02/27(土) 13:11:02
NULL使えや

その方が読みやすくていいやんけ
806デフォルトの名無しさん:2010/02/27(土) 14:34:06
C FAQ 的には「0つかえや」
807デフォルトの名無しさん:2010/02/27(土) 14:35:06
ただし関数のプロトタイプ宣言してね。あと可変長引数ではきゃすとしてね。
808デフォルトの名無しさん:2010/02/27(土) 14:43:40
>>806
「どうでもいい」がC FAQの立場だろ
809デフォルトの名無しさん:2010/02/27(土) 14:49:05
8086 の話がでているが、
sizeof(void (*)()) != sizeof(void *)
のことは挙がってきていませんね。問題だとはおもうのですけどね。
810デフォルトの名無しさん:2010/02/27(土) 14:52:58
>>803
ある型のヌルポインタは別の型にキャストしてもヌルポインタであることが保証されているはず
811デフォルトの名無しさん:2010/02/27(土) 14:54:41
>>809
どういう問題がありますかね
812デフォルトの名無しさん:2010/02/27(土) 14:57:44
>>809
それが、現実場面で問題になる場面が思い浮かばない。
813デフォルトの名無しさん:2010/02/27(土) 16:33:36
多分 >>809 が言いたいのは、
「NULLポインタは 0 でなく (void *)0 にしろ、そうすればキャストが要らなくなる」
って言う人がいるけど、コードとデータでポインタサイズが違う場合は
やっぱりキャストが必要だよね?これ問題じゃね?
程度の差はあれNULLポインタを 0 で書くのとたいして変わらないんじゃね?

ってことですかね
814デフォルトの名無しさん:2010/02/27(土) 16:47:02
0 と書くのが正統、NULL は邪道
815809:2010/02/27(土) 16:50:29
>>813
実のところ、コンパイラは賢いから普通に書いていて問題になることはないでしょうね。
ちゃんとプロトタイプ宣言して可変長引数に注意しておれば。
816デフォルトの名無しさん:2010/02/27(土) 16:50:39
by Linus C
817デフォルトの名無しさん:2010/02/27(土) 18:11:20
>>797 (>>764)
(void*)0 でもプロトタイプが無い場合に sizeof(void*) != sizeof(T*) であれば破綻する。
実際に 8086 で関数ポインタを受け取る場合が該当するようだね。(>>809

つまりプロトタイプが無い場合には 0 でも (void*)0 でもキャストが必要。

正しい対策は C FAQ にあるとおり。
> 「0」や「NULL」を関数の引数に使うときは、呼ばれる側の 関数が想定しているポインター型にキャストしろ。
void* ではなく「呼ばれる側の関数が想定しているポインター型」にキャストしないといけない。

この対策は NULL が 0 でも (void*)0 でも変わりなく、 >>764 は「Cで#define NULL 0が
ダメな理由」とはならない。
818デフォルトの名無しさん:2010/02/27(土) 20:13:32
プロトタイプが無い場合

#define NULL 0
sizeof(int) != sizeof(void *)
の時に必ず破綻する

#define NULL ((void *) 0)
sizeof(int) != sizeof(void *)かつ、sizeof(void *) != sizeof(type *)
になるtype *を引数に持つ関数の時に破綻する。

お前が必死に屁理屈こねても標準インクルードは変わらない。
819デフォルトの名無しさん:2010/02/27(土) 20:35:09
>>818
屁理屈でもないし、誰も標準インクルードを変えろなんて言ってない。

C FAQ でずーっと昔に答えの出ているところにいまさら >>797 にあるような迷信を
偉そうに吹いてまわられては迷惑なので正しい情報を提供しているだけのこと。


> #define NULL ((void *) 0)
> sizeof(int) != sizeof(void *)かつ、sizeof(void *) != sizeof(type *)
> になるtype *を引数に持つ関数の時に破綻する。

sizeof(int) == sizeof(void *) でも破綻するよ。
820デフォルトの名無しさん:2010/02/27(土) 20:44:03
>>818
関数プロトタイプはオプションといつまでも昔の仕様を言い続けるのもやめてくれ
821デフォルトの名無しさん:2010/02/27(土) 21:44:15
>>820
オプションてのがどういう意味なのかイマイチ分かんないけど、
今の規格でもプロトタイプ宣言は有っても良いし、無くても良い。
822デフォルトの名無しさん:2010/02/27(土) 22:32:52
>>819
迷信でも何でもない。Cにおいては
#define NULL 0は
#define NULL ((void *)0)
に劣るから((void *)0)が採用されている。
お前は((void *)0)が0より劣る事を示せない。(無いんだから示せるわけが無い)

>>820
昔の仕様じゃなくて現在の仕様でも、オプションなんだが。
文句があるなら標準化機構に提案して、サクッてくれ。w
823デフォルトの名無しさん:2010/02/27(土) 22:37:05
>>821-822
お前らの現在って20世紀なんだな
C99でとっくに違反だ
824デフォルトの名無しさん:2010/02/27(土) 22:53:13
>>822
#define NULL 0 が #define NULL ((void *)0) に劣るなんていうのは、
プロトタイプの無い関数の引数や可変長引数にキャスト無しで NULL を
渡せると信じている無学なプログラマにとって、且つ、ポインターの
内部表現がどんなデータ型でも同じマシンに限って、の話でしかない。

だれも((void *)0)が0より劣る事を示そうなどと考えていないし、示す必要も
ないが、こういう誤解を広める元になっているという点で劣っていると言える
かもしれない。
825デフォルトの名無しさん:2010/02/27(土) 23:02:25
>>823
C99 で関数の宣言は必須になったかもしれないけど、プロトタイプは必須になってないよ。
826デフォルトの名無しさん:2010/02/27(土) 23:31:17
>>823
残念ながらC99でも違反じゃないんだ。出直しといで。

>>824
劣って無いのだから示せるわけが無い。残念だったな。
827デフォルトの名無しさん:2010/02/27(土) 23:40:48
>>826
繰り返すが、だれも((void *)0)が0より劣る事を示そうなどと考えていないし、
示す必要もない。従って残念でもなんでもない。

#define NULL 0 でも #define NULL ((void *)0) でも、正しい知識を持ち、
無駄に移植性を失うようなコードを書かないプログラマにとってはどちらも同じ。
どちらが劣るということは無い。
828デフォルトの名無しさん:2010/02/27(土) 23:57:32
>>827
無駄。無駄。無駄。無駄。

#define NULL ((void *)0)
これが現実であり、全て。
829デフォルトの名無しさん:2010/02/28(日) 00:01:27
>>828
お前の使ってるコンパイラでそれが現実であり全てであることに
ケチをつけるつもりは無いんだけど、他のコンパイラでも同じであるかの
ような根拠の無い主張を繰り返すのはやめてくれ。

初心者が見て「じゃあ可変長引数に渡すときのキャストは要らないんだ」
なんて思われては困る。
830デフォルトの名無しさん:2010/02/28(日) 00:07:23
>>828
お前も((void *)0)が0に勝ってる点を言えてないが。

代表的なのCでそうなってるからそっちの方が優れているに違いない、
という論旨?
831デフォルトの名無しさん:2010/02/28(日) 00:07:27
そもそも #define NULL (void *)0 なんて環境あるの?
ANSI以前の昔はあったらしいけど、>>828 はどういう環境なんだろう

今手元にはcygwinしかないけど、#define NULL 0 になってるし、
Solarisも同様だったはず
832デフォルトの名無しさん:2010/02/28(日) 00:09:02
#ifndef NULL
# if defined(__cplusplus) || defined(_Windows)
# define NULL 0
# else
# define NULL ((void *)0)
# endif
#endif
833デフォルトの名無しさん:2010/02/28(日) 00:17:07
>>831
Cygwin なら GCC だよね?ずっと前から __null になってるはずだけど?
http://gcc.gnu.org/viewcvs/trunk/gcc/ginclude/stddef.h?view=markup#l392
834デフォルトの名無しさん:2010/02/28(日) 00:17:18
void * がない C では char * で代用してた
835デフォルトの名無しさん:2010/02/28(日) 00:23:28
>>830
C では (void*)0 のほうが好ましいのは確かで、整数 0 を意図している箇所と
区別できることにより >>732-734 のようなコードに対して簡単に警告を出すことが
できる。

先日からがんばってる人が言っているような、型が不明な引数に正しいキャスト
無しでも渡すことができるようにするため、などという理由では無い。
836デフォルトの名無しさん:2010/02/28(日) 00:26:28
    ∧,_∧ ♪
  (( (    )
♪   /    ) )) なーんだ♪なーんだ♪なーんだ♪
 (( (  (  〈
    (_)^ヽ__)

♪  ∧_∧
   (´・ω・`) ))
 (( ( つ ヽ、  NULL♪NULL♪NULL♪
   〉 とノ )))
  (__ノ^(_)
837デフォルトの名無しさん:2010/02/28(日) 00:38:15
>>832
Windows Cプログラミングだと (void*)0 でなくて 0 なのは何で?
838デフォルトの名無しさん:2010/02/28(日) 01:36:54
C言語にスコープ解決演算子ってありましたっけ?
839デフォルトの名無しさん:2010/02/28(日) 01:46:33
ないよ。
840デフォルトの名無しさん:2010/02/28(日) 01:47:40
>>830
とっくに言っている。優れているから採用されている。

>>835
他の理由があっても否定する理由にはならない。
841デフォルトの名無しさん:2010/02/28(日) 01:57:10
>>840
まず1点だけ確認させてください。

NULL を ((void*)0) と定義したところで、可変長引数やプロトタイプの無い関数の
引数にキャスト無しで渡した場合に問題が発生する可能性は無くなりませんよね?
842デフォルトの名無しさん:2010/02/28(日) 02:01:19
問題が発生しなくなる場合もある。
問題が発生する場合には、0でも発生する。
843デフォルトの名無しさん:2010/02/28(日) 02:04:06
NULL を意図しているなら NULL と書けばいい
キャストが必要ならキャストすればいいじゃん
844デフォルトの名無しさん:2010/02/28(日) 02:10:00
>>842
「問題が発生しなくなる場合もある」ということですが、可変長引数やプロトタイプの無い
関数の引数にキャスト無しの NULL を渡しても良い場合、というのがあるのでしょうか?
あるとすれば、それはどんなときですか?
845デフォルトの名無しさん:2010/02/28(日) 02:15:59
>>844
条件はこのスレで出ている。お前の負け。
846デフォルトの名無しさん:2010/02/28(日) 02:18:36
>>845 どこ?アンカー頼む。
847デフォルトの名無しさん:2010/02/28(日) 02:22:58
          ____   
       / \  /\ キリッ
.     / (ー)  (ー)\      
    /   ⌒(__人__)⌒ \    お前の負け。
    |      |r┬-|    |      
     \     `ー'´   /      
    ノ            \
  /´               ヽ              
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.    
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //  だっておwwwwwwwwwwwwwwwwwww
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /     バ
 |    |   l||l 从人 l||l      l||l 从人 l||l  バ   ン
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、    ン
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
848デフォルトの名無しさん:2010/02/28(日) 02:25:57
>845
答えられないのに偉そうに
規格書のセクション書いてくれ(キリッ
849デフォルトの名無しさん:2010/02/28(日) 04:08:22
真アホウに煽るアホウ
850デフォルトの名無しさん:2010/02/28(日) 07:47:45
>>848
バカには見えないようだ。
851デフォルトの名無しさん:2010/02/28(日) 09:15:00
今度は裸の王様作戦できたか。
852デフォルトの名無しさん:2010/02/28(日) 09:16:27
ポインタ無しでもC/C++使えますか?
ポインタが無いとダメな例を。
853デフォルトの名無しさん:2010/02/28(日) 09:29:47
手足を縛ってプログラム書くくらいなら最初から手足のない言語を使え。
854デフォルトの名無しさん:2010/02/28(日) 10:51:41
C言語のみの仕事ってあるの?
855デフォルトの名無しさん:2010/02/28(日) 13:32:23
探せばいっぱいあるだろ
組み込みとかデバドラとかソケット通信とか
856デフォルトの名無しさん:2010/02/28(日) 16:04:04
>>852
main()
{
printf("Hello, C world!\n");
}
857デフォルトの名無しさん:2010/02/28(日) 21:21:29
>>852
データ構造を考えなくてはならないところでは、ポインタは必須ですね。
単純な線形リストにしても、ポインタなしでは考えられません。
>>853 のいうとおり、ポインタの必要ない言語はいくらでもありますので、それをお勧めします。
858デフォルトの名無しさん:2010/02/28(日) 21:25:38
なんせポインタだけの本があるくらいだからな。
タイトルだけで中身見てないからどんなこと書いてるのか知らんけど。
859デフォルトの名無しさん:2010/02/28(日) 23:51:12
たぶん、ポインタのことについて書かれてると思う
860デフォルトの名無しさん:2010/02/28(日) 23:58:31
リストだって配列と添え字だけで作れば作れてしまうが
ポインタを使うよりかえって難しくなるだけだぞ

なんでそうまでしてポインタを避ける必要があるのか考えてみなって
結論より考えること自体が大事なことだ
861デフォルトの名無しさん:2010/03/01(月) 00:01:19
ポインタ分からないのに配列分かるのかな
862デフォルトの名無しさん:2010/03/01(月) 00:10:53
ポインタはわかっていてもやってしまうことがあるが、
添字をチェックする配列ならアプリが落ちるだけで済む。
863デフォルトの名無しさん:2010/03/01(月) 00:13:07
>>862
どういう意味?
864デフォルトの名無しさん:2010/03/01(月) 00:13:56
>>861
ちょっとスレ違いだが BASIC の配列はポインタを知らなくても一応使うには使えるね
865デフォルトの名無しさん:2010/03/01(月) 00:19:22
それはBASICの人が思ってる配列の役割とCの人が思ってる配列の役割(っていうかカバーする範囲)の差だわな
866デフォルトの名無しさん:2010/03/01(月) 00:38:33
いみふ
867デフォルトの名無しさん:2010/03/01(月) 00:49:17
Cの配列の参照は *(p+i) の短縮表記なので、ポインタと同じ。バッファオーバーランをやってしまう可能性がある。
他の言語では、たいてい配列の添字のチェックが入るので、実行時エラーですむ。
868デフォルトの名無しさん:2010/03/01(月) 01:30:12
要するに言語的に欠陥ってこと?
なんでこんな言語が未だに学校で支持されてるんだろうな
869デフォルトの名無しさん:2010/03/01(月) 01:31:34
まず自分の頭を直せよ
870デフォルトの名無しさん:2010/03/01(月) 02:02:29
実行時にチェックしてたら遅いじゃん
871デフォルトの名無しさん:2010/03/01(月) 02:13:31
>852
メモリが無理なとき

馬鹿でかいサイズでもそのデータのポインタなら受け渡せる
872デフォルトの名無しさん:2010/03/01(月) 02:28:26
ポインタのみの本があるのが理解できないw
最近はC/C++も人気なくなってマシになったが、15年くらい前なんて
ポインタ○△×なんて本がC言語セクションにずらららららーーーっと並んでた。
873デフォルトの名無しさん:2010/03/01(月) 07:55:16
void f(const char *string) {
char *endOfString;
endOfString = string + strlen(string);
}
と書いてgcc -Wall -ansiでコンパイルしたら
warning: assignment discards qualifiers from pointer target type
という警告が来た
char *型とconst char *型って直接演算できなかったっけ?
874デフォルトの名無しさん:2010/03/01(月) 08:45:16
演算というより、const char*なポインタをchar*なポインタには代入できない。
逆の代入は可能、同じconst char*ならいいのでendOfStringをconst char* にするべきか。
875デフォルトの名無しさん:2010/03/01(月) 08:58:44
endOfString自体(ポインタの指す先ではなくアドレス)を書き換えるからchar *でなくては
endOdString = (char *)filename + strlen(filename);
ならおkだよね

でもなぜ
> const char*なポインタをchar*なポインタには代入できない
876デフォルトの名無しさん:2010/03/01(月) 09:24:19
逆はできるよ。よく考えな。
877874:2010/03/01(月) 09:47:28
char * const endOfString; なら代入の左にできない。
878デフォルトの名無しさん:2010/03/01(月) 12:25:24
あ、よく考えればfilenameをendOfStringにコピーする必要はないね
const char *filenameはfilenameの指す先を変更できないけど、filename自体の値は書き換えられるから
879デフォルトの名無しさん:2010/03/01(月) 22:22:50
最初にポインタあり言語を覚えた人=ポインタ当たり前・必須・便利
最初にポインタなし言語を覚えた人=ポインタ怖い・めんどくさい
880デフォルトの名無しさん:2010/03/01(月) 22:28:47
それは違う。
881鬼神の名無し:2010/03/02(火) 20:58:06
C言語の事詳しく教えてください!
882デフォルトの名無しさん:2010/03/02(火) 22:28:37
>>881
宿題スレで突っ込まれながらコードを書くのが吉。
883デフォルトの名無しさん:2010/03/02(火) 22:29:29
884デフォルトの名無しさん:2010/03/03(水) 01:52:30
>>881
言語Cって言わないと、「そんなものは無い!」とかいってキチガイが飛んでくるぞwwww
885デフォルトの名無しさん:2010/03/03(水) 03:08:44
>>881
とりあえず最新のC++/CLIでもいじってみ
886デフォルトの名無しさん:2010/03/03(水) 03:12:50
>>885
その微妙な釣りはやめて
887デフォルトの名無しさん:2010/03/03(水) 08:17:34
とりあえず環境から揃えたいんだが、EclipseでCって使いやすいのかな?
インストールと設定だけで大変そうなんだが
888デフォルトの名無しさん:2010/03/03(水) 08:21:32
基本情報処理の為の午後の言語で悩んでる。独学です。
C言語にしようと思うんだが、JAVAも面白そうだし
889デフォルトの名無しさん:2010/03/03(水) 09:21:12
去年の春から確か表計算が選択できるはずだから
それが一番楽かもよ

個人的にはCが一番やりがいがあるとは思うけど

890デフォルトの名無しさん:2010/03/03(水) 09:28:38
言語の仕様は、アセンブラの次に単純だから、早く習得したいならCかな。
ポインタにはまらなければ。
891デフォルトの名無しさん:2010/03/03(水) 13:16:37
Cは教養、学びたいなら選ぶべき
単に資格取りたいなら889が言う様に表計算でもJAVAでもいいんじゃね
892デフォルトの名無しさん:2010/03/03(水) 13:54:16
ハッカーを目指すならC
土方を目指すならJava
893デフォルトの名無しさん:2010/03/03(水) 14:05:49
ハッカーも、職業プログラマなら業界のスタンダードな資格は
取得しているものなのでしょうか。
894デフォルトの名無しさん:2010/03/03(水) 14:45:50
自分の言語の根っこみたいなものが、JAVAにあるとC#とかに行くのは楽だけど、その他に行くときにわりとやり直しになる
根っこがPerlとかだともっとつらい 人によってはPerlに閉じこもっちゃうくらい
根っこ作りをCでやっておくと、かなり自由に枝を伸ばせると思う
C++やJAVAの機能でも「ああ、こうやって実現してるんだろうな」、とか「こう使うと便利だろうな」
とかってメカニズムに対する勘が働くし


>スタンダードな資格は取得しているもの

資格が給料に意味を持つ会社と、まったく気にしない会社があるよ
資格持ってるやつを馬鹿にする社風のところもある(意外と技術力高いところに多い)
どっちにしろ資格で仕事のできるできないは判断できないから、あくまで重要なのは本人の能力

クライアントが資格持ってるSEを入れろというなら資格持ってる新入社員を契約書上のリーダーにするなんて事もある
実際は何もできなくても
895デフォルトの名無しさん:2010/03/03(水) 14:52:12
perlに閉じこもるとか気の毒すぎるだろ
896デフォルトの名無しさん:2010/03/03(水) 14:59:53
IPAの情報処理の資格は持っててもいいんじゃね?
英語力がどーたら、TOEICが…とか言っているのはSE(システムエンジニア)だし。
897デフォルトの名無しさん:2010/03/03(水) 15:06:00
TOEICが重要視されるかは知らんが、出来て当然な感はある
898デフォルトの名無しさん:2010/03/03(水) 15:12:50
でもあれだよな

いくらTOIECの点高くても、コミュ能力の低いプログラマ(結構多い)はやっぱ英語でも口下手だったりするよな
相手が女だったりするとさらに酷くなってみたりして
なんでお前となりの席のアメリカ人とメッセンジャーでやり取りなんだよwwみたいなやついたもの
899デフォルトの名無しさん:2010/03/03(水) 15:31:01
英語はツールであって、話す内容がなければ意味ないのは当然だろ
プログラミング技術はあっても何を作る、何をするってアイデアが無いのと同じ
900デフォルトの名無しさん:2010/03/03(水) 15:33:03
加えてTOEICはコミュ力なんて全く関係ないからな
英語の記事や本読めるだけで良い場合、いつまでたっても関係ない
901デフォルトの名無しさん:2010/03/03(水) 16:03:37
> コミュ能力の低いプログラマ(結構多い)

同じプログラマや技術者に対するコミュ能力は高いんだがな。
誰だって、自分の属する文化内ではコミュ能力は高いのさ。
そして、異文化交流が下手なのはプログラマだけではあるまい。
902デフォルトの名無しさん:2010/03/03(水) 16:08:22
んなことねーよ
誰とも口きかないし、しゃべても何いってるかわからん
女と話すときょどるやつの率は、他業種に比べて格段に多いと思う
903デフォルトの名無しさん:2010/03/03(水) 16:09:43
それって、下っ端の話?
904デフォルトの名無しさん:2010/03/03(水) 16:12:24
そりゃま、だれかの上司には成れないだろうな
905デフォルトの名無しさん:2010/03/03(水) 16:15:20
マ同士のコミュが常に上手く行くならマ板のスレは半分以下になるだろうなw
906デフォルトの名無しさん:2010/03/03(水) 16:16:47
社会不安障害の病人は放っとけよ。それより大した話術も無いのに粋がってる奴はなんなんだよw
907デフォルトの名無しさん:2010/03/03(水) 16:17:48
*同士のコミュが常に上手く行くなら職業板のスレは半分以下になるだろうなw
908デフォルトの名無しさん:2010/03/03(水) 16:23:16
いい加減スレチ
909デフォルトの名無しさん:2010/03/03(水) 16:26:12
うちの会社の先輩(下っ端ってわけじゃないけど役職はなし)の話
すれ汚しだけど

いまだに銀縁の四角いめがねで、壁紙がおにゃんこクラブの名前知らないやつで
飲み会で会話に混じらずいつも80年代のアイドルとかゲームの曲を聞いてるwwww

ナウシカとか魔女の宅配便の悪口を言うと「あわっ!、わわっ!」って感じで激怒する
キーボードはキートップに何も書いていないHHK使っていて
ふざけて同僚が「あいうえお」とか「自爆スイッチ」とか「押すと死ぬよ」とか「ウンコでるよスイッチ」とか書いたら
1ヶ月会社来なくなって、上司にえれーおこられた(先輩は同僚の20倍は仕事はできるので)

どういう仕組みかよくわからんけど
手首をポンとやるとナイフが飛び出すやつを会社の女の子にみつかってから女子は誰もそいつと口きかなくなった
910デフォルトの名無しさん:2010/03/03(水) 16:28:50
それがコピペじゃないなら、お前も大概だな
911デフォルトの名無しさん:2010/03/03(水) 16:30:43
敏腕マと底辺マは、属する文化が違うというお話
912デフォルトの名無しさん:2010/03/03(水) 16:32:33
ごめん、みんなの話し見ててまるで先輩の事言っているようだなと思ってつい書いちゃった
本当はもっともっとエピソードあるんだけど

もちろん彼が極端な例だということも、そもそもスレ違いだということもわかってるよ
でもつい
913デフォルトの名無しさん:2010/03/03(水) 16:33:21
小学生と一緒に仕事してるのか
話したくも無い気持ちはよく分かる
914デフォルトの名無しさん:2010/03/03(水) 16:33:21
>「ウンコでるよスイッチ」

小学生かよw
915デフォルトの名無しさん:2010/03/03(水) 16:34:29
>同僚が「あいうえお」とか「自爆スイッチ」とか「押すと死ぬよ」とか「ウンコでるよスイッチ」とか書いたら

どこの幼稚園?その会社の商品を使いたくないんだけど
内情を2chにも書き込んじゃうくらいだから情弱集団なんだろう
916デフォルトの名無しさん:2010/03/03(水) 16:39:58
プログラマ同士なら、ソースを通して理解し合えるはずだ
917デフォルトの名無しさん:2010/03/03(水) 16:40:55
良いこと言うじゃん
918デフォルトの名無しさん:2010/03/03(水) 16:43:18
あらら、みんな先輩の側に同情的なんだね
単に笑ってもらえるかと思ったのに

>会社の商品を使いたくないんだけど

残念だったね、インフラにかかわる仕事なんで離島で自給自足でもない限り、ほぼ確実に君は使ってるよ

>内情を2chにも書き込んじゃうくらいだから情弱集団なんだろう
内情ってほどのことはないだろ、でもいつも明るい笑いが絶えない職場だよ(^^)v

>プログラマ同士なら、ソースを通して理解し合えるはず

もちろんプログラマとしての彼の技術は尊敬に値する。まったくかなわない
919デフォルトの名無しさん:2010/03/03(水) 16:45:14
>>918
>同僚が「あいうえお」とか「自爆スイッチ」とか「押すと死ぬよ」とか「ウンコでるよスイッチ」とか書いたら

こんな奴らと気持ち悪く笑いながらやってんだろうな。笑われるのはお前の方だろ
920デフォルトの名無しさん:2010/03/03(水) 16:45:24
そういうのを笑える奴は嫌いだから
921デフォルトの名無しさん:2010/03/03(水) 16:46:01
いつも明るい笑いが絶えない職場は人の所有物にウンコでるよスイッチとか書いて喜ぶ人間の溜まり場なんだな勉強になった
922デフォルトの名無しさん:2010/03/03(水) 16:47:29
お前の会社の商品を使いたくないってレスに対して
2chでは
残念ながらお前は絶対使ってるって返すのがデフォなの?w
923デフォルトの名無しさん:2010/03/03(水) 16:49:54
一人もつっこみがいない
すごい入れ食い
924デフォルトの名無しさん:2010/03/03(水) 16:51:46
あれ?なんで俺がフルボッコされんの?ちがくね?
おれそんな悪い事したかぁ?

ここは、「ああ、そういうおかしいやつうちにもいるよ」って流れかと確信してたのに(/o;)

ははーん、さてはみんなの心の中にも小さい先輩がいるんだなぁ
925デフォルトの名無しさん:2010/03/03(水) 16:55:46
逆に、2chでDQNの武勇伝がフルボッコされなかったことがあるのか疑問
926デフォルトの名無しさん:2010/03/03(水) 16:59:46
>>924
あなたの職場には最低でも二人以上の人もどきがいて
当人は自分のことを大人だと思っていることはよく分かった
927デフォルトの名無しさん:2010/03/03(水) 17:23:31
>>924
>小さい先輩
種島ぽぷらか。
928デフォルトの名無しさん:2010/03/03(水) 19:05:27
質問です
putcharって int putchar(int c)ですが引数にchar型変数を入れて
char ch = 'a';
putchar(ch);
こういうのはダメなんでしょうか。Visal C++ではエラーも何も出ないんですが・・・
929デフォルトの名無しさん:2010/03/03(水) 19:13:56
>>928
charからintへの型上げ(汎整数拡張)が行われているから

C++だと関数のオーバーロードのためにエラーになるようになっている
930デフォルトの名無しさん:2010/03/03(水) 19:14:59
ダメじゃない
931デフォルトの名無しさん:2010/03/03(水) 19:15:09
>>928
あ、ちなみにそれ環境依存動作だから注意な

charがsigned charの環境だと0x80〜0xffはマイナスの値になっちまうので
出力がおかしくなる事がある

0x00〜0x7fのみ保証されている
932デフォルトの名無しさん:2010/03/03(水) 19:21:05
charは普通signedだろ。
933928:2010/03/03(水) 19:45:59
>>929-932
ありがとうございました
934デフォルトの名無しさん:2010/03/03(水) 20:07:08
>>928です。
つまり、
char ch = 'a';
printf("%c", ch);
も環境依存ってことになりますか?
935デフォルトの名無しさん:2010/03/03(水) 20:59:10
c = getchar(stdin) したあと ungetc(c, stdin) で標準入力ストリームに戻す動作は保証されているの?
これってstdioがバッファリングされている、という前提だと思うんだけど
もしバッファリングされていなければ、標準入力には戻せないよね?
936デフォルトの名無しさん:2010/03/03(水) 21:03:12
未定義
937デフォルトの名無しさん:2010/03/04(木) 00:24:44
>>924
先輩に同情がどうとかじゃなくてお前とお前の同僚の頭の悪さに驚いている
938デフォルトの名無しさん:2010/03/04(木) 07:50:33
うぜーよ、いつまで文句言ってんだろ、もう話し変わってるのに、どんだけ傷ついたんだよww
どうせ先輩のエピソードリストのうちのどれか(もしくは複数)がお前に一致したんだろ?

はいはい、おまえらの心の柔かい所を私は傷つけてしまいました、ごめんなさい
反省してま〜〜す。
939デフォルトの名無しさん:2010/03/04(木) 07:56:17
あまりの自己中に唖然としてる俺がいる
940デフォルトの名無しさん:2010/03/04(木) 10:13:55
ちっうっせーな
反省してまーす
941デフォルトの名無しさん:2010/03/04(木) 10:17:36
いまさらコケボw
どんだけ流行に遅れてんだよw
942デフォルトの名無しさん:2010/03/04(木) 10:17:45
>>934
'a'は0x80未満だから何の問題も出ない。
まあいずれ符号拡張というのを経験するだろう
943デフォルトの名無しさん:2010/03/04(木) 14:40:17
int配列のバブルソートで
特定の値のみソートの対象にしない
(特定値はずっと同じ配列要素数の所に置いておきたい
にはどうしたらいいですか?
944デフォルトの名無しさん:2010/03/04(木) 14:47:15
continue
945デフォルトの名無しさん:2010/03/04(木) 15:06:54
>>941
ちっうっせーな
946938 :2010/03/04(木) 15:09:40
↑ こいつおれじゃねーからな

何が面白くて焚付けてんの?おまえ バカ?
947デフォルトの名無しさん:2010/03/04(木) 15:11:07
↑ こいつおれじゃねーからな

何が面白くて焚付けてんの?おまえ バカ?
948デフォルトの名無しさん:2010/03/04(木) 15:15:38
continue
949デフォルトの名無しさん:2010/03/04(木) 15:17:32
exit
950デフォルトの名無しさん:2010/03/04(木) 21:05:18
return
951デフォルトの名無しさん:2010/03/04(木) 22:36:26
abort
952デフォルトの名無しさん:2010/03/05(金) 00:25:18
>>943
ちょいちょい判定する
か、特定の値の要素番号を別で保持、特定の値を抜いた状態でソートして後から戻す
953デフォルトの名無しさん:2010/03/05(金) 02:01:12
>>943
#include<stdio.h>
#include<stdlib.h>
#define DATA_NUM_MAX 100
#define SPECIAL_VALUE 99 // 特定の値
#define SWAP(type, a, b) {type c;c=a;a=b;b=c;}
void display(int data[], int data_num){
int i;
for(i=0;i<data_num;i++) printf(" %3d", data[i]);
printf("\n");
}
void sort(int data[], int data_num){
int i, j, k;
for(i=0;i<data_num;i++){
for(j=0;j+1<data_num-i;j++){
if(data[j]==SPECIAL_VALUE) continue;
for(k=j+1;k<data_num-i;k++) if(data[k]!=SPECIAL_VALUE) break;
if(k>=data_num-i) break;
if(data[j]<data[k]) SWAP(int, data[j], data[k]);
}
}
}
int main(void){
int data[DATA_NUM_MAX], data_num=DATA_NUM_MAX, i;

for(i=0;i<data_num;i++) data[i]=rand()%101;
display(data, data_num);

sort(data, data_num);
display(data, data_num);
return 0;
}
954デフォルトの名無しさん:2010/03/05(金) 18:27:24
>>953
説明してください汗汗
955デフォルトの名無しさん:2010/03/05(金) 19:03:18
デバッグ中に処理が30fps前後で、リリースしても同じく30前後
にもかかわらず、WindowsMediaPlayerで音楽を再生しながら起動すると60fps
これの原因わかる方いらっしゃいますか?(汗
ソース晒そうにもさらす部分もわからないorz
956デフォルトの名無しさん:2010/03/05(金) 19:16:09
>>955
WMPを起動するとタイマーの分解能が上がる。
957デフォルトの名無しさん:2010/03/05(金) 19:18:49
キーワードはBeginTimePeriod
958デフォルトの名無しさん:2010/03/05(金) 19:19:01
関数とメソッドの違いってなに?手続き型言語とオブジェクト指向言語での言い方の違い?
959955:2010/03/05(金) 19:30:12
回答ありがとうございます。・゚・(ノд`)・゚・。
これで先へ進める!
960デフォルトの名無しさん:2010/03/05(金) 19:35:10
>>958
言い方のちがいではない。
961デフォルトの名無しさん:2010/03/05(金) 19:36:37
chromeケッとか思てたがMS自体もやってたのか
必然性の度合いは違うけど
962デフォルトの名無しさん:2010/03/05(金) 19:49:36
>>958

言語によって関数とかメソッドとか手続きとかが何を意味するかは微妙に違ってる
C言語においては関数とメソッドはイコールと思っていいんじゃないかな
C++ではメソッドはクラスのメンバ関数を指してる
パスカルだとちがうんでなかったっけ だからオブジェクト指向言語での言い方の違いではないと思う
963デフォルトの名無しさん:2010/03/05(金) 20:20:21
そういえばC++だとオブジェクト指向でもあるからメソッドも使えるのか、違う用途なんだ。
ありがとう。
964デフォルトの名無しさん:2010/03/05(金) 20:31:35
言語の話なら、c/c++ではメソッドって言葉は使わない。関数だけ。
COMでメソッドって使うけど、これは言語から離れてる。
965デフォルトの名無しさん:2010/03/05(金) 20:56:24
C++でメソッド使わないって冗談きついぞ
966デフォルトの名無しさん:2010/03/05(金) 21:21:38
>>965
メンバ関数っていうんじゃなかった、公式には?
967デフォルトの名無しさん:2010/03/05(金) 21:37:11
細かいんだよ
968デフォルトの名無しさん:2010/03/05(金) 21:54:16
#include <stdio.h>

int main(void)
{
int i;
int* p;

p = &i;
free(p);
return 0;
}

用済みになった変数はfreeで返すべき、というのが私の見解です。
969デフォルトの名無しさん:2010/03/05(金) 21:55:48
>>968
他所様のものを勝手に弄っちゃダメでしょ
まったく躾がなってないね
親の顔が見てみたいもんだ
970デフォルトの名無しさん:2010/03/05(金) 22:10:02
>>968
malloc() で確保したわけでもないのに free() するのですか?ヒープが壊れやしませんか
971デフォルトの名無しさん:2010/03/05(金) 22:16:25
>970
free()の定義を見ずにそれを言うのはどうかと
>968の言っているfree()は>970の考えているmalloc()と対にして呼ぶような関数では無いのかもしれないよ
僕は>968のようなことを考える人もいるんだなぁ(こいつ分かってないかも)、と思っただけ
972968:2010/03/05(金) 22:17:39
扱うのはスタック領域だから、ヒープ領域が壊れることはないと思うんだけど
#include <stdio.h>

int main(void)
{
{int i;
int* p;

p = &i;
}
return 0;
}

こうすればいいのか
973デフォルトの名無しさん:2010/03/05(金) 22:32:35
>>971
K&R2 には malloc() の返り値でなければならない、と書いてあります。
malloc() の実装によっては、malloc() の返り値以外を free() に与えると、どうなってもしらないよ状態でしょう。
974デフォルトの名無しさん:2010/03/05(金) 22:37:57
でっていう

僕が想像したfree()
free(void *q) { (void)q; /* something */ return 0; }
975デフォルトの名無しさん:2010/03/05(金) 22:40:58
>>968
pを解放し忘れてるぞ。
976デフォルトの名無しさん:2010/03/05(金) 22:53:17
>>974
void free(void *p) なんですけどね。返り値はない。
977デフォルトの名無しさん:2010/03/05(金) 22:54:42
スタック領域をやばいことすると祟られるよ?
978デフォルトの名無しさん:2010/03/05(金) 23:02:22
free()なんて無数に存在するから別に戻り値の型と仮引数の型の直積はなんでも構わないんだけどね
>974は>968に合うように作ったfree()の一例ね
なぜ、>974が>968のfree()の一例になるのかは>971を読んでね
979デフォルトの名無しさん:2010/03/05(金) 23:02:53
前にも自動変数を自分で解放したがるアホが湧いたことあったなあ。
980デフォルトの名無しさん:2010/03/05(金) 23:04:51
>>978
だから、malloc() / free() はついになっていなければならないし、free() は返り値を持たないと、K&R2 に書いてあるのですが。
K&R2 をご存知ないのですか?
981デフォルトの名無しさん:2010/03/05(金) 23:04:59
return a;


return (a);


関数の返り値でこの二種類の違いについて教えてください
お願いします
982デフォルトの名無しさん:2010/03/05(金) 23:06:17
()があるかないかだよ
983デフォルトの名無しさん:2010/03/05(金) 23:06:31
>>979
そして >>975 のいうとおり、自動変数をfree() するならするで徹底してfree() できていないという矛盾。
984デフォルトの名無しさん:2010/03/05(金) 23:07:37
>>981
まぬけかそうでないかの違い
985デフォルトの名無しさん:2010/03/05(金) 23:10:43
関数を呼び出すと、スタックフレームがpushされますが、自動変数の領域の大きさはどこから得ているのですか。
実行時にわかるのでしょうか。autoだけに。
986デフォルトの名無しさん:2010/03/05(金) 23:14:39
コンパイルしやすいと言ったら、PASCALやC、昔のBASICあたり?
987デフォルトの名無しさん:2010/03/05(金) 23:17:26
>>985
ソースみりゃわかるじゃん。
988デフォルトの名無しさん:2010/03/05(金) 23:18:41
>>985
実行時にわかるよ。てかコードに書いてある筈
君もやってみれば?
989デフォルトの名無しさん:2010/03/05(金) 23:19:40
>>985
関数の呼び出し時では引数の個数だけ push すればいいし、関数内の自動変数の種類と個数はコンパイル時に数えることができるでしょう。
990デフォルトの名無しさん:2010/03/05(金) 23:20:04
>>988
コードに書いてあるというのは、テキスト領域に書いてあるということですか。
991デフォルトの名無しさん:2010/03/05(金) 23:20:06
>980
K&Rが全てだと思っている痛い子とはもう話したくない
free()がvoid free(void *)だと思っているし、もう笑うしかないわ
992デフォルトの名無しさん:2010/03/05(金) 23:20:55
>>981
どっちでも動作は一緒です。
993デフォルトの名無しさん:2010/03/05(金) 23:22:08
>>991
すみませんが典拠をお願いいたします。free() は void free(void *) しかないと思うのですが?
994デフォルトの名無しさん:2010/03/05(金) 23:22:14
>>990
そのあたりはコンパイラに依存。
コードに即値として埋め込まれてる場合もあるし
初期データ領域から引っ張ってきて更にちょこちょこ
計算して出せやという命令に
なってる場合もあるし...
995デフォルトの名無しさん:2010/03/05(金) 23:22:27
free()はvoid free(void *)だよ
996デフォルトの名無しさん:2010/03/05(金) 23:22:48
>>990
ソースに書いてある。
997デフォルトの名無しさん:2010/03/05(金) 23:23:09
>>991
釣り馬鹿は失せろ
998デフォルトの名無しさん:2010/03/05(金) 23:24:03
コンピュータが人間に復讐する日
999981:2010/03/05(金) 23:24:56
ありがとうございます
1000デフォルトの名無しさん:2010/03/05(金) 23:25:00
>968
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。